對於socket不理解的可以檢視:c語言通過socket程式設計實現tcp通訊,linux socket程式設計/socket詳解
先看看程式效果圖
提示如果伺服器,直接通過ctrl+z關閉,這樣程式占用的位址不會釋放,需要以下操作
1.ps //檢視程序
2.kill -9 程式pid //強制殺死程序
服務端:
客戶端:
接下來是**
服務端:
客戶端:#include #include //包含套接字的函式庫
#include //包含af_inet的相關結構
#include //包含af_inet的操作函式
#include #include #include #include /*
監聽後,一直處於accept阻塞狀態, 直到有客戶端連線,
輸入eof後,斷開與客戶端的連線,輸入quit關閉伺服器
讀取eof後,斷開和此客戶端連線,讀取quit關閉伺服器
*/
#define port 3333
void main()
printf("建立套接字成功\n");
/****************************開啟位址復用*******************/
int optval = 1;//1允許位址重用0禁止
int optlen = sizeof(optval);
setsockopt(s_fd,sol_socket,so_reuseaddr,&optval,optlen);
/********************初始化伺服器套接字*****************/
//htons和htonl將埠和位址轉成網路位元組序
//定義伺服器中位址中的域,af_inet指ipv4
s_addr.sin_family = af_inet;
//定義服務端的套接字埠
s_addr.sin_port = htons(port);
//定義套接字位址
//ip可是本伺服器的ip,用巨集inaddr_any代替,代表0.0.0.0,表明所有位址
s_addr.sin_addr.s_addr = htonl(inaddr_any);
/****************繫結套接字設定的埠號和ip***********************/
//對於bind,accept之類的函式,裡面套接字引數都是需要強制轉換成(struct sockaddr *)
//bind三個引數:伺服器端的套接字的檔案描述符
s_len = sizeof(s_addr);//設定傳送訊息長度
if( bind(s_fd,(struct sockaddr*)&s_addr,s_len) < 0)
printf("繫結套接字成功\n");
/*****************設定伺服器上的socket為監聽狀態*******************/
//監聽,最大連線數10
if(listen(s_fd,10) < 0)
printf("監聽成功埠: %d\n", port);
while(1)
printf("新連線:\n");
//inet_ntoa ip位址轉換函式,將網路位元組序ip轉換為點分十進位制ip
//表示式:char *inet_ntoa (struct in_addr);
printf("\tip is %s\n", inet_ntoa(c_addr.sin_addr));
printf("\tport is %d\n", htons(c_addr.sin_port));
printf("等待訊息...\n");
while(1)else if(databytes == 0)else
printf("%s\n",recvbuf);
//判斷退出,quit,斷開連線,關閉客戶端
if(strncmp(recvbuf,"quit",4) == 0)
//eof,斷開連線
if(strncmp(recvbuf, "eof",3) == 0)
/************************傳送資料*************************/
printf("--------------------傳送:");
scanf("%s",sendbuf);
send(c_fd,sendbuf,strlen(sendbuf)+1,0);
//判斷退出,quit,斷開連線,關閉客戶端
if(strncmp(sendbuf,"quit",4) == 0)
//eof,斷開連線
if(strncmp(sendbuf,"eof",3) == 0)
}//while 收發訊息
printf("斷開連線\n\n");
}//while accept
//關閉連線
close(s_fd);
printf("程式結束\n");
return;
}
#include #include //包含套接字的函式庫
#include //包含af_inet的相關結構
#include //包含af_inet的操作函式
#include #include #include #include /*
連線到伺服器後,會不停迴圈,等待輸入,
輸入eof後,斷開連線,輸入quit,斷開連線並關閉伺服器
讀取eof後,斷開連線,讀取quit,斷開連線並關閉伺服器
*/
#define port 3333
void main()
printf("建立套接字成功\n");
/********************初始化客戶端套接字*****************/
//htons和htonl將埠和位址轉成網路位元組序
//定義客戶端中位址中的域,af_inet指ipv4
addr.sin_family = af_inet;
//定義服務端的套接字埠
addr.sin_port = htons(port);
//指定伺服器端的ip,本地測試:127.0.0.1
//inet_addr()函式,將點分十進位制ip轉換成網路位元組序ip
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
/**********************連線伺服器**********************/
if(connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
printf("連線到伺服器...\n");
while(1)
if(strcmp(sendbuf, "eof") == 0)
//讀取訊息
printf("--------------------讀取:");
fflush(stdout);
databytes = recv(sockfd, recvbuf, 200, 0);
printf("%s\n", recvbuf);
if(strncmp(recvbuf, "quit",4) == 0)
if(strncmp(recvbuf, "eof",3) == 0)
}//關閉連線
close(sockfd);
printf("程式結束\n");
return;
}
TCP套接字程式設計
網路程式設計又稱為套接字程式設計,為了與遠端計算機進行資料傳輸,需要連線到網際網路,而程式設計中的 套接字 就是用來連線該網路的工具。它本身具有連線的含義,還可以表示為兩台計算機之間的網路連線。4.呼叫accept函式受理連線請求 基於tcp的服務端 客戶端 tcp伺服器端預設函式呼叫順序 sock...
TCP套接字程式設計!!!
一 socket程式設計的基本函式詳解,其中根據客戶端還是服務端,或者根據使用tcp還是udp,函式的呼叫流程有些許區別 1 socket 函式用於建立乙個套接字,一條通訊線路的端點。3 listen 在服務端程式成功建立套接字和與位址進行繫結之後,還需要準備在該套接字上接收新的連線請求。此時呼叫l...
tcp套接字程式設計
1.tcp協議 傳輸控制協議 面向連線,傳輸可靠,面向位元組流。實現資料可靠傳輸,傳輸靈活但是會造成資料粘包問題。2.tcp客戶端與服務端通訊流程 3.實現 客戶端 1 include tcpsocket.hpp 2 include3 4 void sigcb int signo 5 8 9 int...