TCP通信,理解都在注释里,看着敲敲。
TCP的三次握手可以看http://www.cnblogs.com/leezhxing/p/4524176.html可以看出listen()函数阶段完成的三次握手,accept()时三次握手已经完成。
关于listen函数的backlog参数可以看:http://blog.chinaunix.net/uid-24782829-id-3456109.html
tcp_client.c
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> /* struct hostent 需要 */ #define PORT 4321 /* server端口 */ #define MAXSIZE 100 int main(int argc, char *argv[]) { int sockfd; //socket文件描述符 int num; //用于存储接收和发送的字节数 char buf[MAXSIZE]; //用于recv的接收字符数组 struct hostent *he; //通过域名获取IP struct sockaddr_in server; //存储server的socket信息 /* 例如: ./tcp_client.out 127.0.0.1 */ if (argc != 2) { printf("Usage: %s <IP Address> ",argv[0]); exit(1); } if((he=gethostbyname(argv[1]))==NULL) { printf("gethostbyname() error "); exit(1); } //建立socket if((sockfd=socket(AF_INET,SOCK_STREAM, 0))==-1) { printf("socket() error "); exit(1); } //server端的socket信息 bzero(&server,sizeof(server)); //先清空server server.sin_family = AF_INET; server.sin_port = htons(PORT); //转为网络字节序 server.sin_addr = *((struct in_addr *)he->h_addr); //看udp的client的解释 if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))==-1) { printf("connect() error "); exit(1); } char str[] = "hello "; //send成功返回发送的字节数,失败返回-1 if((num=send(sockfd,str,sizeof(str),0))==-1){ printf("send() error "); exit(1); } //recv成功返回接收的字节数,失败返回-1 if((num=recv(sockfd,buf,MAXSIZE,0))==-1) { printf("recv() error "); exit(1); } buf[num-1]='