本文目錄一覽:
- 1、tcp網絡編程(C語言)
- 2、用C語言寫一段代碼,與192.168.1.1的tcp80端口建立連接
- 3、Windows系統用C語言寫TCP通信
- 4、tcp長連接編程和短連接編程的區別
- 5、Linux C語言 C/S程序,客戶端發送的數據和服務器端接收到的數據不一樣,求解
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