Linux网络编程之服务端和客户端简单代码的实现

字节序转换api

  • uint16_t htons(uint16_t host16bitvalue); // 返回网络字节序的值
  • uint32_t htonl(uint32_t host32bitvalue); // 返回网络字节序的值
  • uint16_t ntohs(uint16_t net16bitvalue); // 返回主机字节序的值uint32_t
  • uint32_t ntohl(uint32_t net32bitvalue); // 返回主机字节序的值

说明:h代表host,n代表net,s代表short(两个字节),l代表long(4个字节),通过上面的4个函数可以实现主机字节序和网络字节序之间的转换。有时可以用 INADDR_ANY, INADDR_ANY指定地址操作系统自己获取。

demo:

// 服务端

#include <stdio.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   int s_fd;
   char readBuf[128];
   int n_read;
   char msg[128] = "I get your connect";

   struct sockaddr_in s_addr;
   struct sockaddr_in c_addr;

   memset(&s_addr, 0, sizeof(struct sockaddr_in));
   memset(&c_addr, 0, sizeof(struct sockaddr_in));

   s_fd = socket(AF_INET, SOCK_STREAM, 0);
   if(s_fd == -1){
          perror("socket");
          exit(-1);
   }

   s_addr.sin_family = AF_INET;     // 协议族
   s_addr.sin_port = htons(8988);  //  端口号,记得要将字节序转换成网络字节序
   inet_aton("192.168.1.12", &s_addr.sin_addr);  // IP地址

   bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));

   listen(s_fd, 10);
   int clen = sizeof(struct sockaddr_in);
   
   c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen);   
   if(c_fd == -1){
                   perror("accept");
   }
            
   
   printf("get connect: %s\n",inet_ntoa(c_addr.sin_addr)); // 这里输出时IP地址要转化成字符串的形式

   n_read = read(c_fd,readBuf,128);
   if(n_read == -1){
               perror("read");
   }else{

         printf("get massage:%d,%s\n",n_read,readBuf);
   }         

   write(c_fd,msg,strlen(msg));                    
                               
   return 0;

}

// 客户端

#include <stdio.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   int c_fd;
   char readBuf[128];
   int n_read;
   char *msg[128] = "msg from client";

   struct sockaddr_in c_addr;
   memset(&c_addr, 0, sizeof(struct sockaddr_in));

   c_fd = socket(AF_INET, SOCK_STREAM, 0);
   if(c_fd == -1){
          perror("socket");
          exit(-1);
   }

   c_addr.sin_family = AF_INET;
   c_addr.sin_port = htons(8988);
   inet_aton("192.168.1.12", &c_addr.sin_addr);

   if(connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr_in)) == -1){
                        perror("connect");
                        exit(-1);

   }
   write(c_fd,msg,strlen(msg));
   
   n_read = read(c_fd,readBuf,128);
   if(n_read == -1){
             perror("read");
   }else{
             printf("get message from server:%d,%s\n",n_read,readBuf);
   }
    
   return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值