TCP实现断开重连

//服务端程序
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <inttypes.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <errno.h>

#define COUNTOF(x)  (sizeof(x)/sizeof(*x))
#define PORT 5566
#define SIZE 10

typedef struct server_context_st
{
	int count;
	int clifds[SIZE];
	fd_set allfds;
	int maxfd;
}server_context_st;

int main()
{
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	server_context_st server;
	char msg[1024] = "";
	const char* str = "datakkkkkkkk";
	
	
	int sockfd = -1;
	if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == -1)
	{
		fprintf(stderr, "socket create failed");
		return -1;
	}
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	if(bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) == -1)
	{
		perror("bind failed.");
		return -1;
	}
	
	listen(sockfd, 5);
		
	int sClient;
	struct sockaddr_in remoteAddr;
	int nAddrlen = sizeof(struct sockaddr);
ACCEPT:
	printf("acceptting....\n");
	sClient = accept(sockfd, (struct sockaddr*)&remoteAddr, &nAddrlen);
	if(sClient == -1)
	{	
		perror("accept error!");
		return -1;					
	}
	printf("accept a socket:(%s:%d)\n", inet_ntoa(remoteAddr.sin_addr), remoteAddr.sin_port);
		
	FD_ZERO(&server.allfds);
	FD_SET(sClient, &server.allfds);
	
	struct timeval timeout = {0, 500};
	server.clifds[server.count++] = sClient;
	
	server.maxfd = sClient;
	
	
	while(1)
	{
		fd_set readSet, writeSet;
		FD_ZERO(&readSet);
		readSet = server.allfds;
		FD_ZERO(&writeSet);
		writeSet = server.allfds;
		
		int total = select(server.maxfd+1, &readSet, &writeSet, NULL, &timeout);
		if(total == -1)
		{
			continue;
		}
		
		for(int i = 0; i < server.count; i++)
		{
			int ss = server.clifds[i];
			
			if(FD_ISSET(ss, &readSet) != 0)
			{									
				int recvBytes = recv(ss, msg, COUNTOF(msg), 0);
				if(recvBytes == -1 || recvBytes == 0)
				{
					close(ss);
					FD_CLR(ss, &server.allfds);
					printf("disconnect a socket.\n");
					server.count = 0;
					goto ACCEPT;
				}
				else 
				{
					printf("%s\n", msg);
					bzero(msg, sizeof(msg));
				}								
				
			}			
			
		}
	}
	
	close(sockfd);
	close(sClient);
	return 0;
}

//客户端发送数据
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <inttypes.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <errno.h>


#define PORT 5566

int main()
{
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	
	int sockfd = -1;
	if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == -1)
	{
		perror("socket create failed");
		return -1;
	}
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = inet_addr("10.10.63.70");
	if(connect(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) == -1)
	{
		perror("connect server failed\n");
		return -1;
	}
	char chs[512] = "";
	ssize_t nbytes = 0;
	
	while(1)
	{
		scanf("%s", chs);
		nbytes = send(sockfd, chs, strlen(chs), 0);
		if(nbytes < 0)
		{
			fprintf(stderr, strerror(errno));
			break;
		}
		printf("send %d bytes.\n", nbytes);
		memset(chs, 0, sizeof(chs));		
	}
	close(sockfd);
	return 0;	
}



版权声明:本文为qq_39851127原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。