c語言tcp長鏈接,C++ tcp通信

本文目錄一覽:

tcp網絡編程(C語言)

以下是兩個文件.client.c和server.c

server.c

client.c

運行效果如下

用C語言寫一段代碼,與192.168.1.1的tcp80端口建立連接

很早以前寫的一段示例代碼,希望對你有幫助

//windows TCP Client

# include “winsock2.h”

void main(void)

{

WSADATA wsaData;

SOCKET s;

SOCKADDR_IN ServerAddr;

int Port = 80;

 

//初始化Windows Socket 2.2

 

WSAStartup(MAKEWORD(2,2),wsaData);

 

// 創建一個新的Socket來連接服務器

 

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

 

// 填寫客戶端地址信息

// 端口為80

// 服務器IP地址為”192.168.1.1″,注意使用inet_addr將IP地址轉換為網絡格式

 

ServerAddr.sin_family = AF_INET;

ServerAddr.sin_port = htons(Port);

ServerAddr.sin_addr.s_addr = inet_addr(“192.168.1.1”);

 

// 向服務器發出連接請求 

connect(s, (SOCKADDR *) amp;ServerAddr, sizeof(ServerAddr));

 

// 新的連接建立後,就可以互相通信了,在這個簡單的例子中,我們直接關閉連接,

// 並關閉監聽Socket,然後退出應用程序

 

closesocket(s);

 

// 釋放Windows Socket DLL的相關資源

 

WSACleanup();

}

Windows系統用C語言寫TCP通信

#include

#include

#include

#pragma comment(lib,”ws2_32.lib”)

typedef struct{

SOCKET accpt;

int lock;

}Arg;

void *transfer(void *arg)

{

Arg * info = (Arg *)arg;

SOCKET clientSock;

char recvbuf[102];

char sendBuf[] = “10”;

int ret;

memcpy(clientSock,(void*)info-accpt,sizeof(clientSock));

info-lock =1;

while (TRUE)

{

ret = send(clientSock,sendBuf,2,0);

if (ret == -1)

{

break;

}

ret = recv(clientSock,recvbuf,102,0);

printf(“%s\n”,recvbuf);

}

return (void *)0;

}

void* timer(void *arg)

{

time_t last = time(NULL);

time_t now;

int i = 20;

while(i–)

{

now = time(NULL);

if(now – last == 1)

{

printf(“1s past!\n”);

last = now;

}

Sleep(500);

}

printf(“timer exit.\n”);

return (void *)0;

}

int main(void) {

WSADATA wsaData;

SOCKET ListenSocket;

SOCKADDR_IN service,client;

int len = sizeof(client);

Arg argument;

pthread_t tid;

char sendBuf[] = “ID=2;WHAT=host”;

int iResult = WSAStartup(MAKEWORD(2,2), wsaData);

if (iResult != NO_ERROR) {

printf(“Error at WSAStartup()\n”);

return 1;

}

ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (ListenSocket == INVALID_SOCKET) {

printf(“Error at socket(): %ld\n”, WSAGetLastError());

WSACleanup();

return 1;

}

service.sin_family = AF_INET;

service.sin_addr.s_addr = inet_addr(“127.0.0.1”);

service.sin_port = htons(27115);

if (bind( ListenSocket,

(SOCKADDR*) service,

sizeof(service)) == SOCKET_ERROR) {

printf(“bind() failed.\n”);

closesocket(ListenSocket);

WSACleanup();

return 1;

}

if (listen( ListenSocket, 1 ) == SOCKET_ERROR) {

printf(“Error listening on socket.\n”);

closesocket(ListenSocket);

WSACleanup();

return 1;

}

argument.lock = 1;

printf(“Waiting for client to connect…\n”);

pthread_create(tid,NULL,timer,NULL);

while(TRUE){

argument.accpt = accept( ListenSocket, (SOCKADDR*)client, len );

if (argument.accpt == INVALID_SOCKET) {

printf(“accept failed: %d\n”, WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1;

} else {

printf(“accept%s:%d\n”,inet_ntoa(client.sin_addr),client.sin_port);

while (!argument.lock);

argument.lock = 0;

// sendto(argument.accpt,sendBuf,sizeof(sendBuf),0,(SOCKADDR*)client,len);

pthread_create(tid,NULL,transfer,argument);

//send(AcceptSocket,sendBuf,sizeof(sendBuf),0);

}

}

// No longer need server socket

closesocket(ListenSocket);

WSACleanup();

return 0;

}

tcp長連接編程和短連接編程的區別

長連接就是建立TCP連接後,一直保持這個連接,一般會中間彼此發送心跳來確認對應的存在,中間會做多次業務數據傳輸,一般不會主動斷開連接。

短連接一般指建立連接後,做一些操作 如:http請求,然後就關掉這個連接。所以就做短連接。

Linux C語言 C/S程序,客戶端發送的數據和服務器端接收到的數據不一樣,求解

估計你是用的tcp socket,導致「videlord」網友說的情況:對於tcp socket,send與recv不是對等的,recv時只要緩衝有數據就會收上來。簡單說就是你send 4次,比如分別為10 10 10 10位元組,對端可以一次recv到這40位元組數據,也可以recv 40次、每次1位元組。

解決辦法有兩種:

改用udp socket,send/recv自然對等了

繼續用tcp socket,自己進行數據分段:比如自行約定在數據前約定4個位元組用於描述數據長度,這樣發送時,send 4+33位元組,send 4+35位元組;接收時,先獲取描述長度的4位元組獲得長度,再按照長度接收數據(可能需要多次recv湊齊指定長度)。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/279741.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-20 15:05
下一篇 2024-12-20 15:05

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • NodeJS 建立TCP連接出現粘包問題

    在TCP/IP協議中,由於TCP是面向位元組流的協議,發送方把需要傳輸的數據流按照MSS(Maximum Segment Size,最大報文段長度)來分割成若干個TCP分節,在接收端…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Avue中如何按照後端返回的鏈接顯示圖片

    Avue是一款基於Vue.js、Element-ui等技術棧的可視化開發框架,能夠輕鬆搭建前端頁面。在開發中,我們使用到的圖片通常都是存儲在後端服務器上的,那麼如何使用Avue來展…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論