這裡打算寫乙個在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)
的迴圈中,但是放置到外面就會出現在乙個時刻只能連線乙個客戶端。為了解決這個問題現行的方法有多程序、多執行緒、poll
和select
處理,下一章將用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位址使用固定的設定,...