linux下简易socket编程

最近研究了一下linux下的socket编程。这里写一个简易的版本上去。主要是分client和server两个部分。

对于client比较简单,这里仅做一个简单的client。可以给自己的server发送一条消息并且可以得到一条服务器返回的消息,之后结束进程。

#include 
  
  
   
   
#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
        #include 
       
         #define MAXNUM 255 #define BINDPORT 8000 int main(int argc, char** argv) { int iSocketFd; int iRecvLen; //用来获取返回的字符串长度 char cRecvMsg[MAXNUM]; //用来获取由服务器传来的信息 char cSendMsg[MAXNUM]; struct sockaddr_in Saddr; if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket init error"); exit(0); } memset(&Saddr, 0, sizeof(Saddr)); Saddr.sin_family = AF_INET; //代表用的ipv4协议 Saddr.sin_port = htons(BINDPORT); //用来获取主机server的IP地址 if(inet_pton(AF_INET, argv[1], &Saddr.sin_addr) <= 0) { printf("inet_pton error"); exit(0); } if(connect(iSocketFd, (struct sockaddr*) &Saddr, sizeof(Saddr)) < 0) { printf("connect error"); exit(0); } //读取一行作为传送给server的信息 fgets(cSendMsg, MAXNUM, stdin); if(send(iSocketFd, cSendMsg, strlen(cSendMsg), 0) < 0) { printf("send error"); exit(0); } if((iRecvLen = recv(iSocketFd, cRecvMsg, MAXNUM, 0)) < 0) { printf("receive error"); exit(0); } cRecvMsg[iRecvLen] = '\0'; //将收到的信息末端添加\0以便输出。 printf("received:%s", cRecvMsg); close(iSocketFd); return 0; } 
        
      
     
     
    
    
   
   
  
  

对于server。中间采用了调用子进程来进行收发消息的机制,这样如果扩展可以用来并发的接待多位client.

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
        
          #include 
         
           #include 
          
            #define BINDPORT 8000 int handleMsg(int iConnectFd); int main(int argc, char ** argv) { int iSocketFd, iConnectFd; struct sockaddr_in Saddr; char cServerAns[40] = "Server received Msg"; char cMsg[255]; pid_t pid; if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("create socket error"); exit(0); } memset(&Saddr, 0, sizeof(Saddr)); Saddr.sin_family = AF_INET; Saddr.sin_addr.s_addr = htonl(INADDR_ANY); Saddr.sin_port = htons(BINDPORT); if(bind(iSocketFd, (struct sockaddr*)&Saddr, sizeof(Saddr)) < 0) { printf("bind error"); } if(listen(iSocketFd, 10) < 0) { printf("listen socket error"); exit(0); } while(true) { if((iConnectFd = accept(iSocketFd, (struct sockaddr*)NULL, NULL)) < 0) { printf("accept socket error"); } pid = fork(); if(pid < 0) { printf("fork error"); exit(0); } else if(pid == 0) //调用子进程进行收发信息 { handleMsg(iConnect_fd); close(iConnectFd); } else if(pid > 0) { close(iConnectFd); } } close(iSocketFd); } int handleMsg(int iConnectFd) { char cTime[255]; char cRecvMsg[255]; int iRecvLen; int iMsgLen; time_t now; iRecvLen = recv(iConnectFd, cRecvMsg, 255,0); cRecvMsg[iRecvLen] = '\0'; now = time(0); strftime(cTime, 255, "%Y.%m.%d_%H:%M:%S", localtime(&now)); printf("%s %d %s", cTime, getpid(), cRecvMsg); //打印当前时间 子进程号 收到的信息 if(send(iConnectFd, "you are connected!\n", 19, 0) < 0) { printf("send error"); exit(0); } } 
           
          
         
       
      
      
     
     
    
    
   
   
基本就是这样。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值