你的位置:首页 > 操作系统

[操作系统]Linux下简单的socket通信实例


Linux下简单的socket通信实例

 

 If you spend too much time thinking about a thing, you’ll never get it done.

                                                                                                                                      —Bruce Lee

      学习网络编程也一段时间了,刚开始看《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 102411 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> \n");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\n",strerror(errno),errno);32 exit(0);33 }34 35 printf("send message to server\n");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\n");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 102412 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\n");33 34 for(;;)35  {36 if((connfd = accept(listenfd,(struct sockaddr*)NULL,NULL))==-1)37  {38 printf("accpet socket error: %s errno :%d\n",strerror(errno),err no);39 continue;40  }41 42 n = recv(connfd,buff,MAXLINE,0);43 buff[n] = '\0';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:协议族

family说明
AF_INETIPv4协议 
AF_INET6IPv6
AF_LOCALUnix域协议(15章)
AF_ROUTE 路由套接字(18章)
AF_KEY密钥套接字(19章)

 type:套接字的类型

type说明
SOCK_STREAM(常用)字节流套接字
SOCK_DGRAM数据报套接字
SOCK_SEQPACKET 有序分组套接字
SOCK_RAW原始套接字

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

protocol说明
IPPROTO_TCPTCP传输协议
IPPROTO_UDPUDP传输协议
IPPROTO_SCTPSCTP传输协议

    

#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、代码下载