Linux多執行緒三 簡單的TCP服務端和客戶端傳輸

2021-10-23 10:25:08 字數 2605 閱讀 1784

服務端 

/*

int socket(int domain, int type, int protocol);

建立乙個協議族為domain、協議型別為type、協議編號為protocol的套接字檔案描述符

函式socket()的引數domain用於設定網路通訊的域,

函式socket()根據這個引數選擇通訊協議的族。

函式socket()的引數type用於設定套接字通訊的型別。

函式socket()的第3個引數protocol用於制定某個協議的特定型別,

即type型別中的某個型別。

繫結伺服器的位址和埠到socket,這樣做就是讓客戶端來發現用以連線的伺服器的位址

int bind(int sockfd, const struct sockaddr *addr, socklen_t len);

返回值:成功返回0,失敗返回-1

引數sockfd: 伺服器socket

套接字可以繫結到所有的網路埠。這意味著可以收到這個系統所有網絡卡的資料報。

一般我們在使用sockaddr_in型別的結構體代替sockaddr結構體

伺服器呼叫listen函式來宣告可以接受連線請求

int listen(int sockfd, int backlog);

引數backlog:用於表示伺服器能接受的請求數量

一旦伺服器呼叫了listen,套接字就能接收連線請求。使用函式accept函式來接受並建立請求

int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);

引數sockfd: 伺服器socket

引數len: addr的長度

如果不關心客戶端ip,那麼addr和len可以設為null

收發資料,用函式recv()、send()/sendto()或者read()、write()

關閉網路連線,close()

*/#include#include#include#include#include#includeint startup(int _port,const char* _ip)

struct sockaddr_in local;

local.sin_family=af_inet;

local.sin_port=htons(_port);

local.sin_addr.s_addr=inet_addr(_ip);

socklen_t len=sizeof(local);

if(bind(sock,(struct sockaddr*)&local,len)<0)//繫結乙個固定的網路位址和埠號

if(listen(sock,5)<0)//導致套介面從closed狀態換到listen狀態

return sock;

}int main(int argc,char* ar**)

int listen_socket=startup(atoi(ar**[2]),ar**[1]);

struct sockaddr_in remote;

socklen_t len=sizeof(struct sockaddr_in);

while(1)

printf("client,ip:%s,port:%d\n",inet_ntoa(remote.sin_addr)\

,ntohs(remote.sin_port));

char buf[1024];

while(1)

else

}close(socket);

}

return 0;

}

客服端

#include#include#include#include#include #include static void usage(const char* proc)

int main(int argc,char* ar**)

int sock=socket(af_inet,sock_stream,0);

if(sock<0)

struct sockaddr_in server;

server.sin_family=af_inet;

server.sin_port=htons(atoi(ar**[2]));

server.sin_addr.s_addr = inet_addr(ar**[1]);

if(connect(sock,(struct sockaddr*)&server,(socklen_t)sizeof(server))<0)

//三次握手建立鏈結

char buf[1024];

while(1)

close(sock);//四次握手

return 0;

}

gcc client.c -o client -lpthread

gcc server.c -o server -lpthread

./server 127.16.10.207 8080

./client 172.16.10.207 8080

簡單的Linux多執行緒程式設計

最近在實習的公司做乙個ros系統,有個部分需要控制電機,以及分析電機碼盤給上來的資料,用的是串列埠通訊。由於碼盤給上來的資料時間是不固定的,下放命令的時間也是不固定的,所以只能做成非同步通訊的形式。所以就需要用到多執行緒程式設計了。程式語言是c,但由於另乙個部分是企業提供的,c 形式,用到了很多類,...

基於Linux多執行緒的併發TCP服務

經過兩天的學習,終於做出來可以向指定客戶端傳送資料的tcp服務,寫本次博文的目的有二,一是將學習成果分享給正在學習tcp併發服務的同行,二是整理一下筆記,方便日後複習。首先說一下為什麼學習tcp併發服務,6個月前去面試嵌入式軟體工程師的面試題是 用兩個半小時的時間用任意語言編寫乙個可以兩個及兩個以上...

Linux 多執行緒程式設計(三)

繼續昨天的執行緒同步,條件變數 condition variables 是用於執行緒間,通訊共享資料狀態改變的機制。簡介條件變數的建立和銷毀 等待條件變數 喚醒等待條件變數的執行緒 簡介 當執行緒互斥地訪問一些共享的狀態時,往往會有些執行緒需要等到這些狀態改變後才應該繼續執行。如 有乙個共享的佇列,...