Linux下TCP Socket程式設計C語言小例項

2021-06-10 00:17:21 字數 3639 閱讀 5375

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 服務端接受到客戶端的連線請求,程序由阻塞態變為執...