免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1283 | 回复: 0
打印 上一主题 下一主题

Linux Socket编程实例(一个Hello World程序) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-11 22:39 |只看该作者 |倒序浏览

在Linux下写了个小的
socket程序,分为客户端和服务器端,服务端开一个端口(2000),做为一个daemon,等待客户的连接请求.一旦有客户连接,服务器端打印出客
户端的IP地址和端口,并且向服务器端发送欢迎信息和时间.下面是服务端的代码(tcpserver.c).由于这只是个简单的程序,所以只用了单线程实
现!
/**
* Tcp Server program, It is a simple example only.
* zhengsh 200520602061 2
* when client connect to server, send a welcome message and timestamp in server.
*/

#include
#include
#include
#include
#include
#include
#include

#define SERVER_PORT 20000 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
#define BUFFER_SIZE 255
#define WELCOME_MESSAGE "welcome to connect the server. "


int main(int argc, char **argv)
{
       int servfd,clifd;
       struct sockaddr_in servaddr,cliaddr;

       if ((servfd = socket(AF_INET,SOCK_STREAM,0))
       {
              printf("create socket error!\n");
              exit(1);
       }
       bzero(&servaddr,sizeof(servaddr));
       servaddr.sin_family = AF_INET;
       servaddr.sin_port = htons(SERVER_PORT);
       servaddr.sin_addr.s_addr = htons(INADDR_ANY);

       if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))
       {
              printf("bind to port %d failure!\n",SERVER_PORT);
              exit(1);
       }

       if (listen(servfd,LENGTH_OF_LISTEN_QUEUE)
       {
              printf("call listen failure!\n");
              exit(1);
       }

       while (1)
       {//server loop will nerver exit unless any body kill the process
              char buf[BUFFER_SIZE];
              long timestamp;
              socklen_t length = sizeof(cliaddr);
              clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);
              if (clifd
              {
                     printf("error comes when call accept!\n");
                     break;
              }
              strcpy(buf,WELCOME_MESSAGE);
              //inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);
              
              printf("from client,IP:%s,Port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
              timestamp = time(NULL);
              strcat(buf,"timestamp in server:");
              strcat(buf,ctime(&timestamp));
              send(clifd,buf,BUFFER_SIZE,0);
              close(clifd);           
              
       }//exit
       close(servfd);
       return 0;
}

客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息
,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.
/* Tcp client program, It is a simple example only.
* zhengsh 200520602061 2
* connect to server, and echo a message from server.
*/


#include
#include
#include
#include
#include
#include

#define SERVER_PORT 20000 // define the defualt connect port id
#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port

#define BUFFER_SIZE 255
#define REUQEST_MESSAGE "welcome to connect the server.\n"

void usage(char *name)
{
       printf("usage: %s IpAddr\n",name);
}

int main(int argc, char **argv)
{     
       int servfd,clifd,length = 0;
       struct sockaddr_in servaddr,cliaddr;
       socklen_t socklen = sizeof(servaddr);
       char buf[BUFFER_SIZE];
      
       if (argc
       {
              usage(argv[0]);
              exit(1);
       }
      
       if ((clifd = socket(AF_INET,SOCK_STREAM,0))
       {
              printf("create socket error!\n");
              exit(1);
       }
       srand(time(NULL));//initialize random generator
       bzero(&cliaddr,sizeof(cliaddr));
       cliaddr.sin_family = AF_INET;
       cliaddr.sin_port = htons(CLIENT_PORT);
       cliaddr.sin_addr.s_addr = htons(INADDR_ANY);

       bzero(&servaddr,sizeof(servaddr));
       servaddr.sin_family = AF_INET;
       inet_aton(argv[1],&servaddr.sin_addr);
       servaddr.sin_port = htons(SERVER_PORT);
       //servaddr.sin_addr.s_addr = htons(INADDR_ANY);

       if (bind(clifd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))
       {
              printf("bind to port %d failure!\n",CLIENT_PORT);
              exit(1);
       }

       if (connect(clifd,(struct sockaddr*)&servaddr, socklen)
       {
              printf("can't connect to %s!\n",argv[1]);
              exit(1);
       }
      
       length = recv(clifd,buf,BUFFER_SIZE,0);
       if (length
       {
              printf("error comes when recieve data from server %s!",argv[1]);
              exit(1);
       }
       printf("from server %s :\n\t%s ",argv[1],buf);

       close(clifd);
       return 0;
}
程序在Fedora core 4下通过编译,有几个warining.但是不影响.

               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104564/showart_2092051.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP