服務端
/*
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 是用於執行緒間,通訊共享資料狀態改變的機制。簡介條件變數的建立和銷毀 等待條件變數 喚醒等待條件變數的執行緒 簡介 當執行緒互斥地訪問一些共享的狀態時,往往會有些執行緒需要等到這些狀態改變後才應該繼續執行。如 有乙個共享的佇列,...