進行socket程式設計的常用函式有:
socket:建立乙個socket
bind:用於繫結ip位址和埠號到socket
connect:
該函式用於繫結之後的client端與伺服器建立連線
listen: 設定能處理的最大連線要求,listen()並未開始接收連線,只是設定socket為listen模式。
accept:用來接受socket連線。
int socket(int family, int type, int protocol);
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
伺服器程式所監聽的網路位址和埠號通常是固定不變的,客戶端程式得知伺服器程式的位址和埠號後就可以向伺服器發起連線,因此伺服器需要呼叫bind繫結乙個固定的網路位址和埠號.bind()成功返回0,失敗返回-1。
int listen(int s,int backlog);
listen()用來等待引數s的socket連線。引數backlog指定同時能處理的最大連線要求。
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
三方插手完成後,伺服器呼叫accept()接受連線,如果伺服器呼叫accept()時還沒有客戶端的連線請求,就阻塞等待直到有客戶端連線上來,cliaddr是乙個傳出引數,accept()返回時傳出客戶端的位址和埠號.
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
客戶端需要呼叫connect()連線伺服器,connect和bind的引數形式一致,區別在於bind的引數是自己的位址,而connect的引數是對方的位址.
服務端**:
#include
#include
#include
#include
#include
#include
#include
#include
#define portnumber 3333
int main(int argc, char *argv)
/* 伺服器端填充 sockaddr結構 */
bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0
server_addr.sin_family=af_inet; // internet
server_addr.sin_addr.s_addr=htonl(inaddr_any); // (將本機器上的long資料轉化為網路上的long資料)和任何主機通訊 //inaddr_any 表示可以接收任意ip位址的資料,即繫結到所有的ip
//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用於繫結到乙個固定ip,inet_addr用於把數字加格式的ip轉化為整形ip
server_addr.sin_port=htons(portnumber); // (將本機器上的short資料轉化為網路上的short資料)埠號
/* **sockfd描述符到ip位址 */
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
/* 設定允許連線的最大客戶端數 */
if(listen(sockfd,5)==-1)
while(1)
fprintf(stderr,"server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); // 將網路位址轉換成.字串
if((nbytes=read(new_fd,buffer,1024))==-1)
buffer[nbytes]='\0';
printf("server received %s\n",buffer);
/* 這個通訊已經結束 */
close(new_fd);
/* 迴圈下乙個 */
} /* 結束通訊 */
close(sockfd);
exit(0);
} 客戶端:
網路程式設計 C S架構,TCP IP介紹
什麼是c s架構?c指的是client 客戶端軟體 s指的是server 服務端軟體 應用軟體如何執行?客戶端軟體想要基於網路傳送一條訊息給服務端軟體,流程是 1 客戶端軟體產生資料,存放於客戶端軟體的記憶體中,然後呼叫介面將自己記憶體中的資料傳送 拷貝給作業系統記憶體 2 客戶端作業系統收到資料後...
socket網路程式設計TCP中C S架構函式框架
建立套接字 socket 填充伺服器網路資訊結構體 sockaddr in 將套接字與伺服器網路資訊結構體繫結 bind 將套接字設定為被動監聽狀態 listen 阻塞等待客戶端的連線請求 accept 進行通訊 recv send 建立套接字 socket 填充伺服器網路資訊結構體 sockadd...
網際網路架構模板,「業務層」技術
網際網路的業務千差萬別,不同的業務分解下來有不同的系統,所以業務層沒有辦法提煉一些公共的系統或者元件。拋開業務上的差異,各個網際網路業務發展最終面臨的問題都是類似的 業務複雜度越來越高。也就是說,業務層面臨的主要技術挑戰就是複雜度。複雜度越來越高的乙個主要原因就是系統越來余越龐大業務越來越多。幸運的...