當前位置:編程學習大全網 - 源碼下載 - 如何用C語言實現向某個IP發送數據包(例如4個浮點數)?

如何用C語言實現向某個IP發送數據包(例如4個浮點數)?

使用socket()編程即可。

1、網絡的Socket數據傳輸是壹種特殊的I/O,Socket也是壹種文件描述符。Socket也具有壹個類似於打開文件的函數調用Socket(),該函數返回壹個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。

2、下面用Socket實現壹個windows下的c語言socket通信例子,這裏客戶端傳遞壹個字符串,服務器端進行接收。

服務器端

#include "stdafx.h"

#include <stdio.h>

#include <winsock2.h>

#include <winsock2.h>

#define SERVER_PORT 5208 //偵聽端口

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int ret, nLeft, length;

SOCKET sListen, sServer; //偵聽套接字,連接套接字

struct sockaddr_in saServer, saClient; //地址信息

char *ptr;//用於遍歷信息的指針

//WinSock初始化

wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本

ret=WSAStartup(wVersionRequested, &wsaData);

if(ret!=0)

{

printf("WSAStartup() failed!\n");

return;

}

//創建Socket,使用TCP協議

sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sListen == INVALID_SOCKET)

{

WSACleanup();

printf("socket() faild!\n");

return;

}

//構建本地地址信息

saServer.sin_family = AF_INET; //地址家族

saServer.sin_port = htons(SERVER_PORT); //註意轉化為網絡字節序

saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址

//綁定

ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));

if (ret == SOCKET_ERROR)

{

printf("bind() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //關閉套接字

WSACleanup();

return;

}

//偵聽連接請求

ret = listen(sListen, 5);

if (ret == SOCKET_ERROR)

{

printf("listen() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //關閉套接字

return;

}

printf("Waiting for client connecting!\n");

printf("Tips: Ctrl+c to quit!\n");

//阻塞等待接受客戶端連接

while(1)//循環監聽客戶端,永遠不停止,所以,在本項目中,我們沒有心跳包。

{

length = sizeof(saClient);

sServer = accept(sListen, (struct sockaddr *)&saClient, &length);

if (sServer == INVALID_SOCKET)

{

printf("accept() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //關閉套接字

WSACleanup();

return;

}

char receiveMessage[5000];

nLeft = sizeof(receiveMessage);

ptr = (char *)&receiveMessage;

while(nLeft>0)

{

//接收數據

ret = recv()(sServer, ptr, 5000, 0);

if (ret == SOCKET_ERROR)

{

printf("recv() failed!\n");

return;

}

if (ret == 0) //客戶端已經關閉連接

{

printf("Client has closed the connection\n");

break;

}

nLeft -= ret;

ptr += ret;

}

printf("receive message:%s\n", receiveMessage);//打印我們接收到的消息。

}

// closesocket(sListen);

// closesocket(sServer);

// WSACleanup();

}

客戶端

#include "stdafx.h"

#include <stdio.h>

#include <stdlib.h>

#include <winsock2.h>

#define SERVER_PORT 5208 //偵聽端口

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int ret;

SOCKET sClient; //連接套接字

struct sockaddr_in saServer; //地址信息

char *ptr;

BOOL fSuccess = TRUE;

//WinSock初始化

wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本

ret = WSAStartup(wVersionRequested, &wsaData);

if(ret!=0)

{

printf("WSAStartup() failed!\n");

return;

}

//確認WinSock DLL支持版本2.2

if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)

{

WSACleanup();

printf("Invalid WinSock version!\n");

return;

}

//創建Socket,使用TCP協議

sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sClient == INVALID_SOCKET)

{

WSACleanup();

printf("socket() failed!\n");

return;

}

//構建服務器地址信息

saServer.sin_family = AF_INET; //地址家族

saServer.sin_port = htons(SERVER_PORT); //註意轉化為網絡節序

saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");

//連接服務器

ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));

if (ret == SOCKET_ERROR)

{

printf("connect() failed!\n");

closesocket(sClient); //關閉套接字

WSACleanup();

return;

}

char sendMessage[]="hello this is client message!";

ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);

if (ret == SOCKET_ERROR)

{

printf("send() failed!\n");

}

else

printf("client info has been sent!");

closesocket(sClient); //關閉套接字

WSACleanup();

}

  • 上一篇:如何在VC中配置winPcap開發環境
  • 下一篇:快手在微信端上線本地生活小程序“吃喝玩樂在快手”
  • copyright 2024編程學習大全網