本节我们看一下怎样才能编写一个基于TCP稳定的客户端或者服务器程序,主要以试验抓包的方式观察数据包的变化,对网络中出现的多种情况进行分析,分析网络程序中常用的技术及它们出现的原因,在之后的编程中能早一点意识到这些潜在问题。实例代码如下: client.c 和server.c 因在试验过程中代码有所改动,本实例代码仅仅是参考。
#include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #include <arpa/inet.h> #include <fcntl.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <errno.h> #define PORT 6666 #define MAXSIZE 1024 void str_cli(FILE *, int); int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "./client IP\n"); return 1; } int fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(PORT); inet_pton(AF_INET, argv[1], &serveraddr.sin_addr); connect(fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); //FILE * fp = fopen("./aa","r"); //str_cli(fp, fd); sleep(60); close(fd); exit(0); } void str_cli(FILE * fp, int fd) { char sendbuff[MAXSIZE], recvbuff[MAXSIZE]; bzero(sendbuff, MAXSIZE); bzero(recvbuff,MAXSIZE); while (fgets(sendbuff, MAXSIZE, fp) != NULL) { write(fd, sendbuff, strlen(sendbuff)); printf("hello\n"); /* if(read(fd, recvbuff, MAXSIZE) == 0) { if(errno == ECONNRESET) { fprintf(stderr, "reconnect\n"); } fprintf(stderr, "server terminated!\n"); exit(1); }*/ fputs(recvbuff, stdout); bzero(sendbuff, MAXSIZE); bzero(recvbuff,MAXSIZE); } }