windows下的UPD例子,一個發送一個接收函式。main先呼叫recv函式時接收正常,除錯時跟蹤到send里,
執行完
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
直接就調出到函式了。sock創建回傳成功的值。
如果先send,發送正常。recv里面就一直阻塞到recfrom 。每個函式單獨呼叫都是正常的的。而且這個在linux運行都正常。
// udptest.cpp : 定義控制臺應用程式的入口點。
//
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")
#define S_PORT 3702
#define R_PORT 3701
#define BUFLEN 2048
int updrecv( void)
{
//初始化網路環境
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("WSAStartup failed\n");
return -1;
}
//建立一個UDP的socket
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == SOCKET_ERROR)
{
printf("create socket failed\n");
return -1;
}
//系結地址資訊
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(R_PORT);
serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if( bind(sock,(sockaddr*)&serverAddr, sizeof(sockaddr)) != 0 )
{
perror("bind");
}
char buf[BUFLEN];
if (TRUE)
{
memset(buf, 0, 512);
// 網路節點的資訊,用來保存客戶端的網路資訊
sockaddr_in clientAddr;
memset(&clientAddr, 0, sizeof(sockaddr_in));
int clientAddrLen = sizeof(sockaddr);
//接收客戶端發來的資料
int ret = recvfrom(sock, buf, BUFLEN, 0, (sockaddr*)&clientAddr, &clientAddrLen);
//int ret = recvfrom(sock, buf, BUFLEN, 0, NULL, NULL);
printf("Recv msg: %s from IP:[%s] Port:[%d]\n", buf, inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
// 發一個資料包回傳給客戶
sendto(sock, "Hello World!", strlen("Hello World!"), 0, (sockaddr*)&clientAddr, clientAddrLen);
printf("Send msg back to IP:[%s] Port:[%d]\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
}
closesocket(sock);
WSACleanup();
return 0;
}
int updsend(void)
{
//初始化網路環境
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("WSAStartup failed\n");
return -1;
}
//發送套接字
//建立一個UDP的socket
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockClient == INVALID_SOCKET)
{
printf("create socket failed\n");
return -1;
}
// 申明一個網路地址資訊的結構體,保存服務器的地址資訊
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(S_PORT);
addr.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");
// addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int opt = -1;
int nb = 0;
nb = setsockopt(sockClient, SOL_SOCKET, SO_BROADCAST, (char*)&opt, sizeof(opt));
if (nb == -1)
{
printf("set socket error...\n");
}
char buf[] = "client test!";
//發送資料
int dwSent = sendto(sockClient, buf, strlen(buf), 0, (SOCKADDR *)&addr, sizeof(SOCKADDR));
if (dwSent == 0)
{
printf("send %s failed\n", buf);
return -1;
}
closesocket(sockClient);
WSACleanup();
}
int main(int argc, char* argv[])
{
updrecv();
updsend();
system("pause");
return 0;
}
uj5u.com熱心網友回復:
哎!除錯了這么長時間才發現問題。是client先把訊息發送了,server后才運行。錯過訊息了,所以接收的時候一直阻塞在recvfrom
uj5u.com熱心網友回復:
你可以通過呼叫WSAGetLastError獲得失敗的原因轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/99999.html
標籤:Windows客戶端使用
上一篇:如何解決MarkdownPad 2 安裝后打不開的問題
下一篇:求助大神win10靜態IP問題
