新聞中心
在網(wǎng)絡(luò)編程中,TCP/IP協(xié)議是最常用的一種協(xié)議,因為它可以保證數(shù)據(jù)傳輸?shù)目煽啃院头€(wěn)定性。而在Linux系統(tǒng)中搭建TCP服務(wù)器也是比較常見的操作。本文將介紹Linux下如何搭建TCP服務(wù)器,讓讀者能夠快速上手和使用。

1. 準(zhǔn)備工作
在開始設(shè)置之前,需要先在Linux系統(tǒng)上安裝好gcc編譯器和支持TCP協(xié)議的庫。具體操作如下:
“`bash
$ sudo apt-get update
$ sudo apt-get install build-essential
$ sudo apt-get install libssl-dev
$ sudo apt-get install libevent-dev
“`
2. 確定服務(wù)器IP地址和端口號
在設(shè)置服務(wù)器之前,需要確定服務(wù)器的IP地址和端口號。IP地址可以是本地IP地址127.0.0.1,也可以是公網(wǎng)IP地址。端口號可以自行選擇,一般默認(rèn)端口號為8000。假設(shè)本文中采用本地IP地址和默認(rèn)端口號8000。
3. 編寫服務(wù)器端代碼
接下來需要編寫服務(wù)器端代碼。服務(wù)器端的主要任務(wù)是監(jiān)聽客戶端的連接請求,并接受、處理、返回客戶端的數(shù)據(jù)。代碼如下:
“`c
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 1024
int mn()
{
// 創(chuàng)建套接字
int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
// 綁定IP地址和端口號
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(8000);
bind(listen_fd, (struct sockaddr*)&addr, sizeof(addr));
// 監(jiān)聽連接
listen(listen_fd, 10);
// 無限循環(huán),等待客戶端連接并處理請求
while(1) {
// 接受客戶端連接請求
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len);
printf(“Client %s:%d connected.\n”, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 接受客戶端數(shù)據(jù)
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
int len = recv(client_fd, buffer, BUFFER_SIZE, 0);
printf(“Received from client %s:%d message: %s.\n”, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer);
// 處理客戶端數(shù)據(jù)
char response[] = “Hello, client!”;
send(client_fd, response, strlen(response), 0);
// 關(guān)閉客戶端連接
close(client_fd);
printf(“Client %s:%d disconnected.\n”, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
}
// 關(guān)閉套接字
close(listen_fd);
return 0;
}
“`
服務(wù)器端代碼主要分為以下幾個步驟:
– 創(chuàng)建套接字:使用socket()函數(shù)創(chuàng)建套接字,并指定協(xié)議類型為TCP。
– 綁定IP地址和端口號:使用bind()函數(shù)綁定服務(wù)器的IP地址和端口號,使服務(wù)器能夠接受來自客戶端的連接請求。
– 監(jiān)聽連接:使用listen()函數(shù)監(jiān)聽接收來自客戶端的連接請求。
– 無限循環(huán),等待客戶端的連接請求并處理請求:使用accept()函數(shù)接受客戶端的連接請求,并接受、處理、返回客戶端的數(shù)據(jù),最后關(guān)閉客戶端連接。
4. 編譯服務(wù)器端代碼
完成服務(wù)器端代碼的編寫后,需要使用gcc編譯器進行編譯。命令如下:
“`bash
$ gcc -o server server.c -levent -lpthread
“`
其中,-levent和-lpthread都是編譯選項,levent是事件庫,pthread是線程庫。
5. 運行服務(wù)器端代碼
完成編譯后,需要在Linux系統(tǒng)上運行服務(wù)器端代碼。命令如下:
“`bash
$ ./server
“`
此時服務(wù)器端已經(jīng)啟動,可以接收來自客戶端的連接請求并處理請求。但由于沒有編寫客戶端代碼,可以使用Linux系統(tǒng)自帶的telnet命令來模擬客戶端連接,命令如下:
“`bash
$ telnet 127.0.0.1 8000
“`
連接成功后可以發(fā)送任意消息,服務(wù)器端將返回“Hello, client!”。
6.
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220server端在linux上,client端在winCE上,通過tcp socket傳輸byte{]
linux sockets和winsock是可以互滑桐相脊余傳遞櫻讓滾信息的,不同的操作系統(tǒng)都得遵循TCP/IP協(xié)議。
我剛備襪剛給其他的朋友寫的socket程序發(fā)給你
服務(wù)器:
include
#include 隱滾鉛
#include
#include
#include
#include
#include
#define LINE 2023
pthread_mutex_t work = PTHREAD_MUTEX_INITIALIZER;
struct sockaddr_in tcpsock, udpsock;
void *handle_tcp(void *arg)
{
int tcpfd = *((int *)arg);
int tcpcon;
int n;
char *suc = “success”;
socklen_t len = 0;
struct sockaddr_in tcpcli;
listen(tcpfd, 20);
char str;
char buf;
while(1)
{
len = sizeof(tcpcli);
tcpcon = accept(tcpfd, (struct sockaddr*)&tcpcli, &len);
pthread_mutex_lock(&work);
printf(“receive from %s at port %d\n”,
inet_ntop(PF_INET, &tcpcli.sin_addr, str, sizeof(str)),
ntohs(tcpcli.sin_port));
pthread_mutex_unlock(&work);
while(1)
{
if((n = read(tcpcon, buf, LINE)) == 0)
{
close(tcpcon);
break;
}
else
{
pthread_mutex_lock(&work);
printf(“\n”, buf);
pthread_mutex_unlock(&work);
write(tcpcon, suc, 8);
}
}
}
}
void *handle_udp(void *arg)
{
int udpfd = *((int *)arg);
socklen_t len;
struct sockaddr_in udpcli;
int n;
char buf;
char *suc = “success”;
while(1)
{
len = sizeof(udpcli);
if((n = recvfrom(udpfd, buf, LINE, 0, (struct sockaddr*)&udpcli, &len)) == -1)
{
pthread_mutex_lock(&work);
fprintf(stderr, “recvfrom error\n”);
pthread_mutex_unlock(&work);
}
else
{
printf(“\n”, atoi(buf));
}
if((n = sendto(udpfd, suc, 8, 0, (struct sockaddr*)&udpcli, sizeof(udpcli))) == -1)
{
pthread_mutex_lock(&work);
fprintf(stderr, “sendto error\n”);
pthread_mutex_unlock(&work);
}
}
}
int main(void)
{
int udpfd, tcpfd;
tcpfd = socket(PF_INET, SOCK_STREAM, 0);
udpfd = socket(PF_INET, SOCK_DGRAM, 0);
pthread_t tcP, udP;
int ret;
bzero(&tcpsock, sizeof(tcpsock));
bzero(&udpsock, sizeof(udpsock));
tcpsock.sin_port = htons(8000);
tcpsock.sin_family = PF_INET;
tcpsock.sin_addr.s_addr = htonl(INADDR_ANY);
udpsock.sin_family = PF_INET;
udpsock.sin_port = htons(8000);
udpsock.sin_addr.s_addr = htonl(INADDR_ANY);
bind(tcpfd, (struct sockaddr*)&tcpsock, sizeof(tcpsock));
bind(udpfd, (struct sockaddr*)&udpsock, sizeof(udpsock));
printf(“waitting message………………….\n”);
if((ret = pthread_create(&tcP, NULL, handle_tcp, (void*)&tcpfd)) != 0)
{
fprintf(stderr, “can’t create tcp thread:%s\n”, strerror(ret));
exit(1);
}
if((ret = pthread_create(&udP, NULL, handle_udp, (void*)&udpfd)) != 0)
{
fprintf(stderr, “can’t create udp thread:%s\n”, strerror(ret));
exit(1);
}
while(1);
return 0;
}
---------------------------
客戶端:
#include
#include
#include
#include
#include
#include
#define LINE 2023
int main(void)
{
struct sockaddr_in tcpsock, udpsock;
int tcpfd, udpfd;
char buf;
int n;
tcpfd = socket(PF_INET, SOCK_STREAM, 0);
udpfd = socket(PF_INET, SOCK_DGRAM, 0);
bzero(&tcpsock, sizeof(tcpsock));
bzero(&udpsock, sizeof(udpsock));
tcpsock.sin_port = htons(8000);
tcpsock.sin_family = PF_INET;
inet_pton(PF_INET, “127.0.0.1”, &tcpsock.sin_addr);
udpsock.sin_port = htons(8000);
udpsock.sin_family = PF_INET;
inet_pton(PF_INET, “127.0.0.1”, &udpsock.sin_addr);
bind(tcpfd, (struct sockaddr*)&tcpsock, sizeof(tcpsock));
bind(udpfd, (struct sockaddr*)&udpsock, sizeof(udpsock));
connect(tcpfd, (struct sockaddr*)&tcpsock, sizeof(tcpsock));
while(1)
{
n = read(0, buf, LINE);
buf = 0;
write(tcpfd, buf, n-1);
read(tcpfd, buf, LINE);
printf(“\n”, buf);
sprintf(buf, “%d”, n);
sendto(udpfd, buf, strlen(buf), 0, (struct sockaddr*)&udpsock, sizeof(udpsock));
recvfrom(udpfd, buf, LINE, 0, NULL, 0);
printf(“\n”, buf);
bzero(buf, LINE);
}
return 0;
}
檢查tcp 有沒有斷開 linux
client/server端recv:讓前
①對端close(fd)檢測(超時檢測):recv 返回0,說明配譽緩存區(qū)數(shù)據(jù)被讀完,實測兩種情況,對端沒有再發(fā)數(shù)據(jù),對端fd被關(guān)閉了。
通過select超時來檢測,當(dāng)超時如2s,我們認(rèn)為對端連接斷開,應(yīng)關(guān)閉本地的fd。
②網(wǎng)線斷開/斷電關(guān)機檢測(超時檢測):recv 返回-1,errno == EAGAIN,意為“沒有可讀寫數(shù)據(jù),緩沖區(qū)無數(shù)據(jù)”。
所以此時需要培滑段select超時檢測,若超時,要么對端沒有再發(fā)數(shù)據(jù),要么對端的網(wǎng)線斷了或者直接斷電了。
超過我們判定為對端不在線,關(guān)閉本地的fd。
關(guān)于tcp serve linux的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌建站設(shè)計,成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價值。
分享文章:Linux下TCP服務(wù)器搭建(tcpservelinux)
文章URL:http://www.5511xx.com/article/cogoegs.html


咨詢
建站咨詢
