linux中一個簡單的TCP套接字程序(1)(內含詳細註釋)

該程序在linux系統中實現了服務器和客戶端之間相互傳送消息,其中服務器和客戶端分別通過一個linux系統中的兩個終端進行模擬。本人使用的linux系統爲CentOS 7。

下面是服務器端的程序:

#include <sys/types.h>
#include <sys/socket.h>                         // 包含套接字函數庫
#include <stdio.h>
#include <netinet/in.h>                         // 包含AF_INET相關結構
#include <arpa/inet.h>                          // 包含AF_INET相關操作的函數
#include <unistd.h>
#define PORT 3339                              //定義端口
int main()
{
   char sendbuf[256]="OK";                     //定義要發送的消息
   char buf[256];                              //定義接收消息的區域
   int s_fd, c_fd;                             // 服務器和客戶套接字標識符
   int s_len, c_len;                           // 服務器和客戶端消息長度
   struct sockaddr_in s_addr;                  // 服務器IPv4套接字地址
   struct sockaddr_in c_addr;                  // 客戶端IPv4套接字地址
   s_fd = socket(AF_INET, SOCK_STREAM, 0);     // 創建套接字
   s_addr.sin_family = AF_INET;                // 定義服務器套接字地址中的域
   s_addr.sin_addr.s_addr=htonl(INADDR_ANY);   // 定義套接字地址爲本機IP
   s_addr.sin_port = PORT;                     // 定義服務器套接字端口
   s_len = sizeof(s_addr);                     // 獲取結構體s_addr的長度
   bind(s_fd, (struct sockaddr *) &s_addr, s_len);// 綁定套接字與設置的端口號

   listen(s_fd, 10);                     // 監聽狀態,守候進程,最大請求數爲10

   printf("請稍候,等待客戶端發送數據\n");
   c_len = sizeof(c_addr);               //獲取客戶端結構體c_addr長度
   c_fd = accept(s_fd,(struct sockaddr *) &c_addr,(socklen_t *__restrict) &c_len);                   //接收客戶端連接請求
   while (1) 
   {
        if(recv(c_fd,buf,256,0)>0)      //接收消息recv(c_fd,buf,256,0)>0
        {
                 printf("收到客戶端消息:\n %s\n",buf);//輸出到終端
                 send(c_fd,sendbuf,sizeof(sendbuf),0);//回覆消息
        }
   }
   close(c_fd); <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">                                // 關閉連接</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">}</span>
</pre><span style="font-size: 18px;">該下面是客戶端的程序:</span><pre name="code" class="cpp">#include <sys/types.h>
#include <sys/socket.h>                         // 包含套接字函數庫
#include <stdio.h>
#include <netinet/in.h>                         // 包含AF_INET相關結構
#include <arpa/inet.h>                          // 包含AF_INET相關操作的函數
#include <unistd.h>
#define PORT 3339                               //定義端口
int main() 
{
   int sockfd;                                 // 客戶套接字標識符
   int len;                                    // 客戶消息長度
   struct sockaddr_in addr;                    // 遠端主機套接字地址
   int newsockfd;
   char buf[256]="come on!";                   // 定義要發送的消息
   int len2;
   char rebuf[256];                            // 定義接收消息的區域

   sockfd = socket(AF_INET,SOCK_STREAM, 0);    // 創建套接字

   addr.sin_family = AF_INET;                  // 遠端主機地址中的域
   addr.sin_addr.s_addr=htonl(INADDR_ANY);     // 遠端主機IP地址
   addr.sin_port = PORT;                       // 遠端主機端口
   len = sizeof(addr);

   newsockfd = connect(sockfd, (struct sockaddr *) &addr, len);
                                               //發送連接服務器的請求
   if (newsockfd == -1) 
   {
      perror("連接失敗");
      return 1;
   }
   len2=sizeof(buf);                           //獲取發送數據的長度
while(1)
{
    printf("請輸入要發送的數據:\n");
    scanf("%s",buf);
    send(sockfd,buf,len2,0);                   //發送消息
    if(recv(sockfd,rebuf,256,0)>0)             //接收新消息
    { 
    printf("收到服務器消息:\n %s \n",rebuf);   //輸出到終端
    }
}
   close(sockfd);                              // 關閉連接
   return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章