一、linux下TCP网络编程基础,需要了解相关函数
Socket():用于套接字初始化。
Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求。
Listen():使socket处于被动的监听模式,并为该 socket 建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们。
Accept():让服务器接收客户的连接请求。
Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接。
Close():关闭socket
Send():发送函数
Recv():接受函数
二、服务器和客户端流程图如下图所示
三、linux下TCP编程实例
TCP服务器程序
1 /* server.c */ 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <sys/ioctl.h> 5 #include <netinet/in.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <string.h> 9 #include <unistd.h> 10 #define PORT 2000 //定义端口号 11 #define BUFFER_SIZE 1024 12 #define MAX_QUE_CONN_NM 5 //最大缓冲队列 13 int main(void) 14 { 15 16 /*下面该以太网套接字地址结构体非常重要*/ 17 struct sockaddr_in server_addr,client_addr; 18 int sin_size,recvbytes,wbytes; 19 int ser_fd,cli_fd; 20 char buf[BUFFER_SIZE]; 21 /* 建立 socket 连接,IPv4 协议,字节流套接字 */ 22 if((ser_fd = socket(AF_INET,SOCK_STREAM,0))== -1) 23 { 24 perror("socket"); 25 exit(1); 26 } 27 printf("Socket id = %d ",ser_fd); 28 /* 初始化 sockaddr_in 结构体 */ 29 server_addr.sin_family = AF_INET; 30 server_addr.sin_port = htons(PORT); 31 server_addr.sin_addr.s_addr = INADDR_ANY; 32 bzero(&(server_addr.sin_zero),8); 33 /* 绑定函数 bind */ 34 if(bind(ser_fd,(struct sockaddr *)&server_addr,sizeof(struct 35 sockaddr))==-1) 36 { 37 perror("bind"); 38 exit(1); 39 } 40 printf("Bind success! "); 41 42 /* 调用 listen 函数,进行监听 */ 43 if(listen(ser_fd,MAX_QUE_CONN_NM)== - 1) 44 { 45 perror("listen"); 46 exit(1); 47 } 48 printf("Listening...... "); 49 50 /* 调用 accept 函数,等待客户端的连接 */ 51 if((cli_fd = accept(ser_fd,(struct sockaddr *)&client_addr,&sin_size))==-1) 52 { 53 perror("accept"); 54 exit(1); 55 } 56 printf("Have client ready for connecting "); 57 58 /* 调用 recv 函数接收客户端的请求 */ 59 memset(buf,0,sizeof(buf)); 60 if((recvbytes = recv(cli_fd,buf,BUFFER_SIZE,0))== -1) 61 { 62 perror("recv"); 63 exit(1); 64 } 65 /* 将收到的信息(客服端发来的信息)打印出来 */ 66 printf("Received a message:%s ",buf); 67 /*对客户端发过来的数据进行处理,只是将首字符加2,再发给客户端*/ 68 buf[0]=buf[0]+2; 69 if( ( wbytes = write(cli_fd,buf,strlen(buf)) ) == -1 ) 70 { 71 perror("handle send"); 72 exit(1); 73 } 74 else 75 printf("handle buf is %s ",buf); 76 /* 关闭 socket */ 77 close(ser_fd); 78 return 0; 79 }
TCP客端程序
1 /*client*/ 2 #include<sys/types.h> 3 #include<sys/socket.h> 4 #include<sys/ioctl.h> 5 #include<netinet/in.h> 6 #include<netdb.h> 7 #include<stdio.h> 8 #include<stdlib.h> 9 #include<string.h> 10 #include<unistd.h> 11 #define PORT 2000 //端口号 12 #define BUFFER_SIZE 1024 13 int main(int argc,char *argv[]) 14 { 15 struct sockaddr_in server_addr; 16 int sockfd,sendbytes,rbytes; 17 //int ser_fd; 18 char buf[BUFFER_SIZE]; 19 struct hostent *host; 20 /*指定输入参数为3个,否则出错*/ 21 if(argc!=3) 22 { 23 perror("Usage:./clinet IP address Text "); 24 exit(1); 25 } 26 /*地址解析函数*/ 27 if( ( host = gethostbyname(argv[1]) ) == NULL ) //得到主机名及相应信息 28 { 29 perror("gethostbyname"); 30 exit(1); 31 } 32 memset(buf,0,sizeof(buf)); 33 sprintf(buf,"%s",argv[2]); 34 buf[strlen(buf)+1]='