黄群老师的计算机网络的第一个lab是不算分的,但是国庆很有时间就干脆想试一试,但是发现之前因为没有写过套接字相关代码所以有些困难。参考了黄群老师的客户端服务器模式下利用套接字编写简单的回音功能的PPT(说实在的那个PPT的代码复制进vim里居然各种格式错误),再加上参考了Linux套接字演示
这篇文章,可算实现了第一个套接字网络编程程序。
上代码:
客户端代码client.c:
#include#include #include #include #include #include #include #define MAXLINE 100//每次传输的最大字节 int main(int argc,char** argv){ int sockfd,n; struct sockaddr_in serveraddr; if(argc!=2){//需要一个输出参数表示想要连接的ip地址 printf("error inputn"); exit(EXIT_FAILURE); } char sendline[MAXLINE],recvline[MAXLINE+1]; sockfd=socket(AF_INET,SOCK_DGRAM,0);//表示以UDP形式生成套接字描述符 memset(&serveraddr,0,sizeof(serveraddr));//内存空间清零 serveraddr.sin_family=AF_INET;//地址家族,通常都是AF_INET代表IPv4 inet_pton(AF_INET,argv[1],&serveraddr.sin_addr); serveraddr.sin_port=htons(1234); while(fgets(sendline,MAXLINE,stdin)!=NULL){//从客户端标准输入输入 sendto(sockfd,sendline,strlen(sendline),0,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); n=recvfrom(sockfd,recvline,MAXLINE,0,NULL,NULL); recvline[n]=0; fputs(recvline,stdout);//从客户端标准输出输出 } exit(0); }
服务端代码server.c:
#include#include #include #include #include #define MAXLINE 100 int main(int argc, char **argv){ char mesg[MAXLINE]; int sockfd, n, len; struct sockaddr_in cliaddr, servaddr; sockfd=socket(AF_INET,SOCK_DGRAM,0); memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");//ip地址 servaddr.sin_port=htons(1234);//端口号 bind(sockfd,(struct sockaddr *) &servaddr, sizeof(servaddr)); for(; ;) {//循环接受客户端的输入并回传 len=sizeof(cliaddr); //recvfrom接收sockfd上的输入,存进mesg中,把客户端信息也保存进cliaddr中 n=recvfrom(sockfd,mesg,MAXLINE,0,(struct sockaddr*)&cliaddr,&len); //发送回客户端 sendto(sockfd,mesg,n,0,(struct sockaddr*)&cliaddr,len); } }
这几个头文件我都不算了解,通过链接里的抄过来的,
然后
gcc server.c -o server
gcc client.c -o client
./server
./client 127.0.0.1
就可以在client端传数据了,会传给服务端再被回传打印:



