基於c/s架構的簡單 server和client 程式存在乙個問題:當客戶端退出,關閉套接字時,伺服器程式會繼續向乙個已關閉的套接字傳送資料,這時核心會傳送 sigpipe 訊號給應用程式,而應用程式對這個訊號的預設處理方式是殺掉程序,最終導致伺服器程式也退出。
解決辦法:使用send 函式,其引數最後乙個用 msg_nosignal 讓sigpipe不影響send函式;
但是,send 函式向乙個已經關閉的套接字寫資料,其返回值為 -1;
那麼,有了這個返回值,就可以自己處理客戶端關閉套接字的問題了。
server.c
#include
/套接字初始化程式
************/
int init_server(u_short port, int backlog)
struct sockaddr_in addr = ,
.sin_zero = , //保留
};socklen_t len = sizeof(addr); //位址結構的長度
if(0 > bind(s, (struct sockaddr *)&addr, len))
if(0 > listen(s, backlog))
return s; //返回監聽套接字
err_step: //錯誤處理段(集中報錯)
close(s);
return -1;
}/tcp執行緒主程式
*************/
void * tcp_main(void*arg)
printf("wait for a client\n");
struct sockaddr_in addr;
socklen_t len = sizeof(addr);start_server:
printf("---------------------wait client connect---------------------------\n");
int rws = accept(s, (struct sockaddr *)&addr, &len); //等待連線 建立讀寫套接字
if(0 > rws)
//列印客戶端的ip和埠
printf("-----------------client : [%s:%d] connected !--------------------\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
while(1)
memset(tcp_send_buffer, 0, tcpbuf_len);
}close(rws);
close(s);
return;
}pthread_t tcp_send_thread(void) //執行緒建立函式
else
return tcp_send_tid;end
********************
另外 signal(sigpipe, sig_handler); 可以捕捉到sigpipe訊號,但是我沒有實現跳轉,不能讓伺服器跳轉到等待連線的狀態,,,歡迎指正。
TCP伺服器 客戶端程式
server tcpserver.cpp檔案 include common initsock.h include cinitsock initsock 初始化winsock庫 int main 填充sockaddr in結構 sockaddr in sin sin.sin family af ine...
伺服器和客戶端 tcp通訊
在vs2013的環境下,伺服器 如下 include include stdafx.h include pragma comment lib,ws2 32.lib using namespace std define buffer rev 1024 define buffer send 1024 i...
TCP伺服器 客戶端 全部集合
include include include pragma comment lib,ws2 32.lib int main closesocket socket 0 closesocket socket 1 wsacleanup 釋放 初始化 if getchar 如果有輸入則關閉程式 else ...