简单的TCP通讯

Server代码

#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>

int main(int argc, const char * argv [])
{
	struct sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(1234);
	//server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);;
	bzero(&(server_addr.sin_zero), 8);

	//创建socket
	int server_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (server_socket == -1) 
	{
		perror("socket error");
		return 1;
	}

	 
	int bind_result = bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
	if (bind_result == -1) 
	{
		perror("bind error");
		return 1;
	}

	//listen侦听 第一个参数是套接字,第二个参数为等待接受的连接的队列的大小,在connect请求过来的时候,完成三次握手后先将连接放到这个队列中,直到被accept处理。如果这个队列满了,且有新的连接的时候,对方可能会收到出错信息。
	if (listen(server_socket, 5) == -1)
	{
		perror("listen error");
		return 1;
	}

	struct sockaddr_in client_address;
	socklen_t address_len;
	int client_socket = accept(server_socket, (struct sockaddr *)&client_address, &address_len);
	if (client_socket == -1) 
	{
		perror("accept error");
		return -1;
	}

	char recv_msg[1024]={0};
	char reply_msg[1024]={0};

	while (1) 
	{
		bzero(recv_msg, 1024);
		bzero(reply_msg, 1024);

		printf("reply:");
		scanf("%s", reply_msg);
		send(client_socket, reply_msg, 1024, 0);

		long byte_num = recv(client_socket, recv_msg, 1024, 0);
		recv_msg[byte_num] = '\0';
		printf("client said:%s\n", recv_msg);

	}

	return 0;
}



Client代码

#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>


int main(int argc, const char * argv [])
{
	struct sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(1234);
	server_addr.sin_addr.s_addr = inet_addr("192.168.1.253");
	bzero(&(server_addr.sin_zero), 8);

	int server_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (server_socket == -1) 
	{
		perror("socket error");
		return 1;
	}
	
	char recv_msg[1024] =  {0};
	char reply_msg[1024] =  {0};

	if (connect(server_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == 0) 
	{
		while (true) 
		{
			bzero(recv_msg, 1024);
			bzero(reply_msg, 1024);
			long byte_num = recv(server_socket, recv_msg, 1024, 0);
			recv_msg[byte_num] = '\0';
			printf("server said:%s\n", recv_msg);

			printf("reply:");
			scanf("%s", reply_msg);
			if (send(server_socket, reply_msg, 1024, 0) == -1) 
			{
				perror("send error");
			}
		}

	}


	printf("Hello, World!\n");
	return 0;
}

/*
#define ntohs(x)    __DARWIN_OSSwapInt16(x) // 16位整数 网络字节序转主机字节序  
#define htons(x)    __DARWIN_OSSwapInt16(x) // 16位整数 主机字节序转网络字节序  
  
#define ntohl(x)    __DARWIN_OSSwapInt32(x)  //32位整数 网络字节序转主机字节序  
#define htonl(x)    __DARWIN_OSSwapInt32(x) //32位整数 主机字节序转网络字节序  

*/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值