本实验基于Linux平台下的C语言编程实现
1.服务器端程序设计步骤:
(1)使用socket()函数创建套接字;
(2)将创建的套接字绑定到指定的地址结构;
(3)listen()函数设置套接字为侦听模式,使服务器处于打开状态;
(4)接受客户端的连接请求,建立连接;
(5)接收、应答客户端的数据请求;
(6)终止连接。
2. 客户端程序设计步骤:
(1)使用socket()函数创建套接字;
(2)调用connect()函数建立一个与TCP服务器的连接;
(3)发送数据请求,接收服务器的数据应答;
(6)终止连接。
代码:
//客户端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define MAXDATASIZE 1000 #define PORT 1234 int main(int argc,char **argv){ int listenfd,nbytes; struct sockaddr_in srvaddr; char buf[MAXDATASIZE]; int i=1; //使用socket()函数创建套接字 listenfd=socket(AF_INET,SOCK_STREAM,0); //listenfd侦听套接字,SOCK_STREAM流式套接字 if(listenfd==-1){ printf("create socket failed !\n"); exit(1); } //指定服务器地址(本地socket地址采用默认值) bzero(&srvaddr,sizeof(srvaddr)); //初始化 srvaddr.sin_family=AF_INET; //IPv4 srvaddr.sin_port=htons(PORT); //htons:host to net long //将字符串形式的IP地址转换成32网络字节序的IP地址 if(inet_aton("127.0.0.1",srvaddr.sin_addr.s_addr)==-1){ printf("addr convert error !\n"); exit(1); } //调用connect()函数建立一个与TCP服务器的连接 if(connect(listenfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1){ printf("connect error !\n"); exit(1); } //接收服务器的数据应答 //recv()函数前三个参数与read()函数一致,第四个参数为0时与read()相同 if((nbytes=recv(listenfd,buf,MAXDATASIZE,0))==-1){ printf("read error !\n"); exit(1); } buf[nbytes]='\0'; printf("Server Massage: %s\n",buf); printf("Input your name: "); //提示输入客户姓名,用来区分不同的客户 scanf("%s",buf); if((nbytes=send(listenfd,buf,strlen(buf),0))==-1){ perror("Send error !\n"); exit(1); } while(i){ printf("Input message(max char:%d):",MAXDATASIZE);//输入要发给server的消息 scanf("%s",buf); if(strlen(buf)<1) i=0; if((nbytes=send(listenfd,buf,strlen(buf),0))==-1){//发送消息 perror("Send error !\n"); exit(1); } if((nbytes=recv(listenfd,buf,MAXDATASIZE,0))==-1){//接收server的反馈消息 perror("read error !\n"); exit(1); } buf[nbytes]='\0'; printf("Server message: %s\n",buf); printf("\n"); } //关闭listenfd close(listenfd); }