tcpserver端
#include #include #include #include #include #include #include //#include #include //#include #include #include /**
關於 sockaddr sockaddr_in socketaddr_un說明
*/#define port 11910 //定義通訊埠
#define backlog 5 //定義偵聽佇列長度
#define buflen 1024
void process_conn_server(int s);
void sig_pipe(int signo);
int ss,sc; //ss為伺服器socket描述符,sc為某一客戶端通訊socket描述符
int main(int argc,char *argv)
//註冊訊號
sighandler_t ret;
ret = signal(sigtstp,sig_pipe);
if(sig_err == ret)
else
printf("訊號掛接成功\n");
/******************bind()****************/
//初始化位址結構
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = af_inet; //協議族
server_addr.sin_addr.s_addr = htonl(inaddr_any); //本地位址
server_addr.sin_port = htons(port);
err = bind(ss,(struct sockaddr *)&server_addr,sizeof(sockaddr));
if(err<0)
/*****************listen()***************/
err = listen(ss,backlog); //設定監聽的佇列大小
if(err < 0)
/****************accept()***************/
/**為類方便處理,我們使用兩個程序分別管理兩個處理:
1,伺服器監聽新的連線請求;2,以建立連線的c/s實現通訊
這兩個任務分別放在兩個程序中處理,為了防止失誤操作
在乙個程序中關閉 偵聽套接字描述符 另一程序中關閉
客戶端連線套接字描述符。注只有當所有套接字全都關閉時
當前連線才能關閉,fork呼叫的時候父程序與子程序有相同的
套接字,總共兩套,兩套都關閉掉才能關閉這個套接字
*/for(;;)
else
//建立乙個子執行緒,用於與客戶端通訊
pid = fork();
//fork 呼叫說明:子程序返回 0 ;父程序返回子程序 id
if(pid == 0) //子程序,與客戶端通訊
else
}}/**
伺服器對客戶端連線處理過程;先讀取從客戶端傳送來的資料,
然後將接收到的資料的位元組的個數傳送到客戶端
*///通過套接字 s 與客戶端進行通訊
void process_conn_server(int s)
sprintf(buffer,"%d bytes altogether\n",size);
write(s,buffer,strlen(buffer)+1);
}}void sig_pipe(int signo)
}
tcpclient端
#include #include #include #include #include //#include #include #include #include #include #include //新增訊號處理 防止向已斷開的連線通訊
/** 訊號處理方式是:1,系統首先呼叫使用者在程序中註冊的函式,2,然後呼叫系統的預設
響應方式,此處我們可以註冊自己的訊號處理函式,在連線斷開時執行
*/#define port 11910
#define buflen 1024
void process_conn_client(int s);
void sig_pipe(int signo); //使用者註冊的訊號函式,接收的是訊號值
int s; //全域性變數 , 儲存套接字描述符
int main(int argc,char *argv)
//訊號處理函式 sigint 是當使用者按乙個 ctrl-c 建時傳送的訊號
ret = signal(sigtstp,sig_pipe);
if(sig_err == ret)
else
printf("訊號掛接成功\n") ;
/*******************connect()*********************/
//設定伺服器位址結構,準備連線到伺服器
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = htonl(inaddr_any);
/*將使用者數入對額字串型別的ip格式轉化為整型資料*/
//inet_pton(af_inet,argv[1],&server_addr.sin_addr.s_addr);
printf("please input server ip address : \n");
read(0,server_ip,50);
//err = inet_pton(af_inet,server_ip,&server_addr.sin_addr.s_addr);
server_addr.sin_addr.s_addr = inet_addr(server_ip);
err = connect(s,(struct sockaddr *)&server_addr,sizeof(sockaddr));
if(err == 0)
else
//與伺服器端進行通訊
process_conn_client(s);
close(s);
}void process_conn_client(int s)
}}void sig_pipe(int signo) //傳入套接字描述符
}
執行結果
tcpserver端
tcpclient端
netstat檢視網路連線
linux網路程式設計 TCP socket程式設計模型
1.程式設計模型 三次握手 四次揮手 2.主要函式說明 位元組序轉換函式 include uint32 t htonl uint32 t hostlong uint16 t htons uint16 t hostshort uint32 t ntohl uint32 t netlong uint16...
TCP Socket通訊學習
學習內容,參見 windows網路程式設計 第7章 winsock基礎 伺服器 客戶端連線模型見下圖。服務端流程 客戶端流程 使用windows的winsock 2程式設計,建立win32控制台工程,進行工程配置。服務端 tcpserver.cpp。include stdafx.h include ...
TCP Socket 通訊流程
流程說明 1 服務端建立乙個指定埠號的serversocket物件,呼叫accept 方法,等待接受客戶端的連線請求 等待期間當前程序處於阻塞狀態 2 客戶端建立乙個socket物件,指定服務點主機的ip位址 或網域名稱 和埠,發出tcp連線請求 3 服務端接受到客戶端的連線請求,程序由阻塞態變為執...