Linux下简单的socket通信实例

Jennifer ·
更新时间:2024-09-20
· 747 次阅读

  学习网络编程也一段时间了,刚开始看《UNIX网络编程》的时候,觉得这本厚厚的书好难啊!看到后来,发现并没有想象中的那么难。如果你是新手,建议你看到第二部分结束后,开始着手写代码。不写代码肯定是不行的。看100遍也没有敲一遍实现一遍来的清楚。敲完以后,带着问题去看书,你会更加有针对性。提高的速度是飞快的,这也是学习任何一本书、一门语言的手段。   我很希望和大家一起分享学习网络编程遇到的种种困难与不顺,也希望和大家一起讨论其中遇到的问题,一起成长,如果你刚开始打算学习网络编程,那这篇文章一定能给你一些帮助,我的邮箱:cvmimi_linhai@foxmail.com,转载请注明出处。   关于怎样介绍这个简单的实例:   --> 1、代码展示,功能介绍   --> 2、首先介绍一下客户端和服务端中函数的功能以及函数的原形。   --> 3、关于连接三次握手和TCP连接关闭时候的分组交换   --> 4、IPv4、IPv6套接字的地址结构   --> 5、一些好的学习网站总结   --> 6、代码下载   client.c 1  #include <stdio.h> 2  #include <sys/socket.h> 3  #include <sys/types.h> 4  #include <stdlib.h> 5  #include <netinet/in.h> 6  #include <errno.h> 7  #include <string.h> 8  #include <arpa/inet.h> 9  #include <unistd.h> 10  #define MAXLINE 1024 11  int main(int argc,char **argv) 12  { 13  char *servInetAddr = "127.0.0.1"; 14  int socketfd; 15  struct sockaddr_in sockaddr; 16  char recvline[MAXLINE], sendline[MAXLINE]; 17  int n; 18 19  if(argc != 2) 20  { 21  printf("client <ipaddress> "); 22  exit(0); 23  } 24 25  socketfd = socket(AF_INET,SOCK_STREAM,0); 26  memset(&sockaddr,0,sizeof(sockaddr)); 27  sockaddr.sin_family = AF_INET; 28  sockaddr.sin_port = htons(10004); 29  inet_pton(AF_INET,servInetAddr,&sockaddr.sin_addr) 30  if((connect(socketfd,(struct sockaddr*)&sockaddr,sizeof(sockaddr))) < 0 ) 31  { 31  printf("connect error %s errno: %d ",strerror(errno),errno); 32  exit(0); 33  } 34 35  printf("send message to server "); 36 37  fgets(sendline,1024,stdin); 38 39  if((send(socketfd,sendline,strlen(sendline),0)) < 0) 40  { 41  printf("send mes error: %s errno : %d",strerror(errno),errno); 42  exit(0); 43  } 44 45  close(socketfd); 46  printf("exit "); 47  exit(0); 48  }-执行:gcc client.c -o client    后启动 ./client 客户端程序 启动前先启动./server-----------------------------------------   server.c 1  #include <stdio.h> 2  #include <sys/socket.h> 3  #include <sys/types.h> 4  #include <string.h> 5  #include <netinet/in.h> 6  #include <stdlib.h> 7  #include <errno.h> 8  #include <unistd.h> 9  #include <arpa/inet.h> 10 11  #define MAXLINE 1024 12  int main(int argc,char **argv) 13  { 14  int listenfd,connfd; 15  struct sockaddr_in sockaddr; 16  char buff[MAXLINE]; 17  int n; 18 19  memset(&sockaddr,0,sizeof(sockaddr)); 20 21  sockaddr.sin_family = AF_INET; 22  sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); 23  sockaddr.sin_port = htons(10004); 24 25  listenfd = socket(AF_INET,SOCK_STREAM,0); 26 27  bind(listenfd,(struct sockaddr *) &sockaddr,sizeof(sockaddr)); 28 29  listen(listenfd,1024); 30 31 32  printf("Please wait for the client information "); 33 34  for(;;) 35  { 36  if((connfd = accept(listenfd,(struct sockaddr*)NULL,NULL))==-1) 37  { 38  printf("accpet socket error: %s errno :%d ",strerror(errno),err no); 39  continue; 40  } 41 42  n = recv(connfd,buff,MAXLINE,0); 43  buff[n] = ''; 44  printf("recv msg from client:%s",buff); 45  close(connfd); 46  } 47  close(listenfd); 48  }   -执行:gcc server.c -o server    后启动 ./server 服务端程序-------------------------------------------------------   > 1、代码展示,功能介绍   上面这个简单的socket通信的代码要实现的功能:从客户端发送一条消息后,服务端接收这条消息,并在服务端显示(recv msg from client:****)。   > 2、首先介绍一下客户端和服务端中函数的功能以及函数的原形。   1  #include <sys/socket.h>   2  int socket(int family, int type, int protocol);   //指定期望的通信协议类型,返回的文件描述符和套接字描述符类似,我们成为套接字描述符,简称sockfd   family:协议族

type:套接字的类型

  protocol:协议类型的常量或设置为0,以选择给定的family和type组合的系统默认值

  #include<arpa/inet.h>   int inet_pton(int family,const char *strptr,void *addrptr);//成功返回1,格式不对返回0,出错返回-1   //作用:p代表表达式 n代表数值  以后所写的所有代码中都有可能会需要这个函数,所以这个函数很重要   //将char所指向的字符串,通过addrptr指针存放   //他的反函数:  inet_ntop()作用相反。可以百度查阅这个函数的功能。因为例子里我们没有涉及到,不介绍了。以后用到的时候再说   //需要注意的是:当他发生错误的时候,errno的值会被置为EAFNOSUPPORT 关于errno值我们一会儿介绍。   #include <sys/socket.h>   int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);//用connect函数来建立与TCP服务器的连接   > 3、关于连接三次握手和TCP连接关闭时候的分组交换   > 4、IPv4、IPv6套接字的地址结构   > 5、一些好的学习网站总结   > 6、代码下载



Linux socket通信 socket

需要 登录 后方可回复, 如果你还没有账号请 注册新账号