c語言實現TCP socket通訊

2021-10-09 15:15:05 字數 3379 閱讀 9196

tcp面向位元組流傳輸資料,提供可靠的資料傳輸服務。通過tcp傳送的資料無差錯、不丟失、不重

復,而且按序到達。由於tcp是基於連線的,所以每一條tcp連線只能是點到點的互動通訊。

伺服器端初始化winsock環境後,便呼叫socket函式建立流式套接字;然後對sockaddr_in結構體進行設

置,設定伺服器繫結的ip位址和埠等資訊並呼叫 bind函式來繫結;繫結成功後,就可以呼叫listen函式設

置連線數量,並進行監聽。直到有來自客戶端的連線請求,伺服器便呼叫accept函式接受連線請求,建立

連線。這時,可以使用recv函式和send函式與客戶端進行資料收發。通訊結束後,關閉套接字,釋放資

源。

#include#include #pragma comment(lib, "ws2_32.lib")

#includebool socketbindandlisten(char *lpszip, int iport);

void sendmsg(char *pszsend);

void acceptrecvmsg();

// 服務端套接字

socket g_serversocket;

// 客戶端套接字

socket g_clientsocket;

int main()

printf("socketbindandlisten ok.\n");

// 傳送資訊

char szsendbuf[max_path] = ;

while (true)

return 0;

}// 繫結埠並監聽

bool socketbindandlisten(char *lpszip, int iport)

; wsastartup(makeword(2, 2), &wsadata);

// 建立流式套接字

g_serversocket = socket(af_inet, sock_stream, 0);

if (invalid_socket == g_serversocket)

// 設定服務端位址和埠資訊

sockaddr_in addr;

addr.sin_family = af_inet;

addr.sin_port = htons(iport); addr.sin_addr.s_un.s_addr = inet_addr(lpszip);

// 繫結ip和埠

if (0 != bind(g_serversocket, (sockaddr *)(&addr), sizeof(addr)))

// 設定監聽

if (0 != listen(g_serversocket, 1))

// 建立接收資料多執行緒

createthread(null, null, (lpthread_start_routine)acceptrecvmsg, null, null, null);

return true;

}// 傳送資料

void sendmsg(char *pszsend)

// 接受連線請求 並 接收資料

void acceptrecvmsg()

; // 注意:該變數既是輸入也是輸出

int ilen = sizeof(addr);

// 接受來自客戶端的連線請求

g_clientsocket = accept(g_serversocket, (sockaddr *)(&addr), &ilen);

printf("accept a connection from client!\n");

char szbuf[max_path] = ;

while (true)

printf("[recv]%s\n", szbuf);

}}

客戶端初始化環境後,便呼叫socket函式建立流式套接字;然後對sockaddr_in結構體進行設定,設定

伺服器的ip位址和埠等資訊並呼叫connect 函式向伺服器傳送連線請求,並等待伺服器響應。伺服器接

受連線請求後,就成功地與伺服器建立連線,這時,可以使用recv函式和send函式與客戶端進行資料收

發。通訊結束後,關閉套接字,釋放資源。

#include #include#pragma comment(lib, "ws2_32.lib")

socket g_clientsocket;

// 連線到伺服器

bool connection(char *lpszserverip, int iserverport);

// 傳送資料

void sendmsg(char *pszsend);

// 建立接收資料多執行緒

void recvmsg();

int main()

printf("connection ok.\n");

// 傳送資訊

char szsendbuf[max_path] = ;

while (true)

return 0;

}bool connection(char *lpszserverip, int iserverport)

; wsastartup(makeword(2, 2), &wsadata);

// 建立流式套接字

g_clientsocket = socket(af_inet, sock_stream, 0);

if (invalid_socket == g_clientsocket)

// 設定服務端位址和埠資訊

sockaddr_in addr = ;

addr.sin_family = af_inet;

addr.sin_port = htons(iserverport);

addr.sin_addr.s_un.s_addr = inet_addr(lpszserverip);

// 連線到伺服器

if (0 != connect(g_clientsocket, (sockaddr *)(&addr), sizeof(addr)))

// 建立接收資料多執行緒

createthread(null, null, (lpthread_start_routine)recvmsg, null, null, null);

return true;

}// 傳送資料

void sendmsg(char *pszsend)

// 接收資料

C語言實現打字通遊戲

打字母遊戲 通過控制台和一些簡單的c語言函式完成乙個簡單的打字母遊戲,練習c語言基本語法和一些簡單的邏輯。注意規範 中注意不要出現魔數,用巨集定義代替,盡量防止魔數的出現。每個函式實現自己的功能,c語言每個函式 盡量保持在20行以下 儘量減少全域性變數的使用。我偷懶使用了 include inclu...

C語言實現memcpy

memcpy和memmove都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,他們的作用是一樣的,唯一的區別是,當記憶體發生區域性重疊 的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。程式設計師面試寶典中有例題 對應的原型如下 v...

C語言實現多型

c 中的多型是指 通過基類物件的指標或者基類物件的引用呼叫虛函式 表現更多派生類的特性,但根據c 多型的實現,我們發現這種方法存在一定的空間和效率的折損。不可否認,多型輕鬆解決了很多任務程中遇到的問題,這與 pure c 的解決方法比起來,更為優雅。在考慮移植性上,c 的光芒要蓋過 c 但 c 的多...