首页 > 编程知识 正文

c语言tcp长链接,C++ tcp通信

时间:2024-03-25 09:50:07 阅读:332878 作者:VKKW

本文目录一览:

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("%sn",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(): %ldn", 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: %dn", WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1;

} else {

printf("accept%s:%dn",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凑齐指定长度)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。