Chinaunix首页 | 论坛 | 博客
  • 博客访问: 558475
  • 博文数量: 63
  • 博客积分: 533
  • 博客等级: 中士
  • 技术积分: 1146
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 17:56
文章分类

全部博文(63)

文章存档

2016年(1)

2014年(23)

2013年(17)

2012年(22)

分类: LINUX

2012-10-20 16:25:02

 
   该部分分为客户端和服务器端两部分,其中服务器端首先建立起socket,然后与本地端口进行绑定,接着就开始接收从客户端的连接请求并建立与它的连接,接下来,接收客户端发送的消息。客户端则在建立socket之后调用socket之后调用connect()函数来建立连接。
 
server.c

点击(此处)折叠或打开

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <netinet/in.h>

  9. #define PORT                4321
  10. #define BUFFER_SIZE            1024
  11. #define MAX_QUE_CONN_NM        5    


  12. int main()
  13. {
  14.     struct sockaddr_in server_sockaddr,client_sockaddr;
  15.     int sin_size,recvbytes;
  16.     int sockfd,client_fd;
  17.     char buf[BUFFER_SIZE];

  18.     //建立socket连接
  19.     if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
  20.     {
  21.         perror("socket");
  22.         exit(1);
  23.     }

  24.     printf("Socket id = %d\n",sockfd);

  25.     //设置sockaddr_in结构体中相关参数
  26.     server_sockaddr.sin_family =AF_INET;
  27.     server_sockaddr.sin_port=htons(PORT);
  28.     server_sockaddr.sin_addr.s_addr=INADDR_ANY;
  29.     bzero(&(server_sockaddr.sin_zero),8);

  30.     int i=1;//允许重复使用本地址与套接字进行绑定
  31.     setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
  32.     //绑定函数bind
  33.     if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1)
  34.     {
  35.         perror("bind");
  36.         exit(1);
  37.     }

  38.     printf("Bind success!\n");
  39.     //调用Listen函数,创建为处理请求的队列
  40.     if(listen(sockfd,MAX_QUE_CONN_NM)==-1)
  41.     {
  42.         perror("listen");
  43.         exit(1);
  44.     }
  45.     printf("Listening....\n");
  46.     //调用accept()函数,等待客户端的连接
  47.     if((client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,&sin_size))==-1)
  48.     {
  49.         perror("accept");
  50.         exit(1);
  51.     }
  52.     memset(buf,0,sizeof(buf));
  53.     //调用recv()函数,接收客户端的请求
  54.     if((recvbytes = recv(client_fd,buf,BUFFER_SIZE,0))==-1)
  55.     {
  56.         perror("recv");
  57.         exit(1);
  58.     }
  59.     printf("Received a message: %s\n",buf);
  60.     close(sockfd);
  61.     exit(0);
  62. }
client.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <netdb.h>
  6. #include <sys/types.h>
  7. #include <netinet/in.h>
  8. #include <sys/socket.h>

  9. #define PORT            4321
  10. #define BUFFER_SIZE        1024

  11. int main(int argc,char *argv[])
  12. {
  13.     int sockfd,sendbytes;
  14.     char buf[BUFFER_SIZE];
  15.     struct hostent *host;
  16.     struct sockaddr_in serv_addr;

  17.     if(argc<3)
  18.     {
  19.         fprintf(stderr,"USAGE:./client Hostname(or ip address) Text\n");
  20.         exit(1);
  21.     }
  22.      //地址解析函数
  23.     if(host=gethostbyname(argv[1])==NULL)
  24.     {
  25.         perror("gethostname");
  26.         exit(1);
  27.     }
  28.      memset(buf,0,sizeof(buf));
  29.      sprintf(buf,"%s",argv[2]);
  30.      //创建socket
  31.      if((sockfd =socket(AF_INET,SOCK_STREAM,0))==-1)
  32.     {
  33.          perror("socket");
  34.          exit(1);
  35.     }
  36.     //设置sockaddr_in结构体中相关参数
  37.     serv_addr.sin_family=AF_INET;
  38.     serv_addr.sin_port=htons(PORT);
  39.     serv_addr.sin_addr=*((struct in_addr*)host->h_addr);
  40.     bzero(&(serv_addr.sin_zero),8);
  41.     //调用connect函数主动发出对服务端的连接
  42.     if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr))==-1)
  43.     {
  44.         perror("Connect");
  45.         exit(1);
  46.     }
  47.     //发送消息给服务端
  48.     if((sendbytes = send(sockfd,buf,strlen(buf),0))==-1)
  49.     {
  50.         perror("Send");
  51.         exit(1);
  52.     }
  53.     close(sockfd);
  54.     exit(0);
  55. }

 socket.rar   
阅读(2523) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~