Linux下C語言Socket網路程式設計

2021-10-04 05:16:48 字數 3676 閱讀 3782

這裡打算寫乙個在linux系統下執行的socket服務端,然後在win下使用網路助手與其連線,達到資料回顯的功能。廢話不多說了,咱們現在開始。

建立socket。

將建立socket時返回的套接字描述符與伺服器ip位址和埠進行繫結。

開始監聽連線到該伺服器的客戶端。

當有客戶端請求與該服務端程式進行連線時,接受客戶端的連線

進行資料傳輸

關閉連線

下面逐步對上述6個步驟使用到的函式進行分析

1、建立socket

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

domain:

系統使用的底層協議族,引數一般為af_inet(ipv4使用)或者af_inet6(ipv6使用),當然還有其他型別的引數,這裡就不一一介紹了。一般我們使用af_inet就可以。

type:

指定使用的套接字型別,sock_stream位元組流套接字,我們編寫tcp程式時可以使用該引數。sock_dgram使用者資料報文協議,使用udp傳輸時,我們可以指定為該引數。

protocol:

使用的協議,一般該引數直接指定為 0 就好。

2、繫結

int bind(int sockfd, struct sockaddr *myaddr,int addrlen)

socket:

第一步建立socket時返回的套接字描述符。

myaddr:

指向繫結的伺服器ip位址的結構體指標。

addrlen:

伺服器ip位址的結構體的長度。

3、監聽

int listen(int sockfd,int backlog)

sockfd:

第一步建立socket時返回的套接字描述符。

backlog:

設定可連線客戶端的最大連線個數,當多個客戶端在同一時刻連線該服務時,能夠允許的個數受到該值得影響。

4、接受客戶端連線請求

int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)

sockfd:

第一步建立socket時返回的套接字描述符。

cliaddr:

指向請求連線到該伺服器端的客戶端的ip位址和埠號

addrlen:

指向客戶端ip位址和埠號的結構體長度的指標。

5、資料傳輸

int send(int sockfd, const void *msg,int len,int flags)

int recv(int sockfd, void *buf,int len,unsigned int flags)

sockfd:

第一步建立socket時返回的套接字描述符。

msg:

傳送資料的指標

buf:

存放接收資料的緩衝區

len:

資料的長度,把flags設定為0

6、關閉連線

int close(int fd)

fd:待關閉的的socket

小提示

#include #include #include #include #include #include #include #include #include #define max_client_num  5    //最大監聽客戶端連線數量為5

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

sfd = socket(af_inet,sock_stream,0);

if (sfd == -1)

printf("socker create faild!\n");

struct sockaddr_in serveraddr;

bzero(&serveraddr,sizeof(struct sockaddr_in));

serveraddr.sin_family = af_inet;

serveraddr.sin_port = htons(atoi(ar**[2])); //伺服器監聽埠號

serveraddr.sin_addr.s_addr = inet_addr(ar**[1]); //此處ip位址必須為linux下網口ip位址

if(bind(sfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr)) == -1)

if(listen(sfd,max_client_num) == -1)

int new_fd;

struct sockaddr_in client_addr;

int socket_len = sizeof(struct sockaddr_in);

bzero(&client_addr,socket_len);

new_fd = accept(sfd,(struct sockaddr*)&client_addr,&socket_len);

if(new_fd == -1)

else //列印請求連線的客戶端ip位址和埠號

while(1)

send(new_fd,buf,rev_num,0); }

printf("client close!\n");

close(sfd);

return 1;

}

將編譯好的**放到linux下進行編譯,並通過ifconfig檢視linux下網路的ip位址,使用ipconfig檢視win下ip位址。確保其能夠相互ping通。

執行編譯後的程式------記得同時指定ip位址和埠號

在介紹int listen(int sockfd,int backlog)函式時,我們說過其第二個引數是控制多個客戶端同時請求連線時的數量的,但是在以上的**中。我們並沒有充分的使用到這個功能,那是因為tcp連線服務端程式的第4步接受客戶端連線請求所使用的函式int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)預設是阻塞的。我們想要實現回顯功能,就不能將其放置到while(1)的迴圈中,但是放置到外面就會出現在乙個時刻只能連線乙個客戶端。為了解決這個問題現行的方法有多程序、多執行緒、pollselect處理,下一章將用select函式實現網路程式設計的io併發處理。

Linux下C語言Socket程式設計

socket用中國話將叫做 套接字 是用來進行網路資料傳輸的一種約定或者說是一種.我們通常說的tcp協議和udp協議都是通過socket來進行連線.每一台連線到網際網路的裝置都會有乙個ip位址,ip位址就像乙個 號碼或者說家庭住址,通過ip才可以唯一地定位到我們要進行網路通訊的網路裝置 乙個裝置一般...

linux下C語言socket網路程式設計簡例

這裡給出在linux下的簡單socket網路程式設計的例項,使用tcp協議進行通訊,服務端進行監聽,在收到客戶端的連線後,傳送資料給客戶端 客戶端在接受到資料後列印出來,然後關閉。程式裡有詳細的說明,其中對具體的結構體和函式的實現可以參考其他資料。程式說明 這裡伺服器的埠號和ip位址使用固定的設定,...

linux下C語言socket網路程式設計簡例

這裡給出在linux下的簡單socket網路程式設計的例項,使用tcp協議進行通訊,服務端進行監聽,在收到客戶端的連線後,傳送資料給客戶端 客戶端在接受到資料後列印出來,然後關閉。程式裡有詳細的說明,其中對具體的結構體和函式的實現可以參考其他資料。程式說明 這裡伺服器的埠號和ip位址使用固定的設定,...