亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求助關于在C++網絡編程中sendto()發包問題!

求助關于在C++網絡編程中sendto()發包問題!

C++ C
繁花如伊 2021-11-12 11:07:27
問題:局域網中某主機1想與Server聯系,如果想在主機1的4000號端口發送,主機1的IP地址:192.168.11.1,通過局域網NET服務器時的發送端口隨機分配可用端口,出去的公有IP是:222.173.30.8;請問應該如何寫代碼發送到服務器消息那?SOCKET S1,S2;::bind(S1, (sockaddr*)(&addr1), Len1); //私有IP及端口::bind(S2 ,(sockaddr*)(&addr2), Len2); //公有IP及端口如果sendto(S2, (char*)(&dUserLogin), sizeof(MSGDef::TMSG_USERLOGIN), 0, (sockaddr*)&serverAddr, sizeof(serverAddr));的話不能保證從主機1的4000端口發包,而sendto()參數結構僅有一個套接字。。。請高手幫忙。。。謝謝一個局域網中的主機具有私有地址,如果想訪問外部網絡,必須在安裝NET服務器進行地址轉換的net,這是一個自動的過程。我現在發送包通過主機的特定端口,然后進行地址轉換成公網IP,然后從特定的對外的端口發出去。
查看完整描述

3 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

bind函數不是server端的專利,客戶端也可以bind一個指定端口。只要在aockaddr_in中指定一個端口(比如4000端口)就可以.
sockaddr_in結構關鍵的幾個字段
sin_family = AF_INET;
sin_addr.s_addr = INADDR_ANY;
sin_port = htons(你要的端口);

查看完整回答
反對 回復 2021-11-14
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

需要先用addr1調用socket()創建socket吧
然后代入addr2調用connect()連接服務器
之后才可以sendto和recv吧

查看完整回答
反對 回復 2021-11-14
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

服務器端(接收端)程序:
1、創建套接字(socket)。
2、將套接字綁定到一個本地地址和端口上(bind)。
3、等待接收數據(recvfrom)。
4、關閉套接字。
客戶端(發送端)程序:
1、創建套接字(socket)。
2、向服務器發送數據(sendto)。
3、關閉套接字。
服務器端代碼:
#include <Winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];

recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}

客戶端代碼:
#include <Winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

sendto(sockClient,"Hello",strlen("Hello")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}



查看完整回答
反對 回復 2021-11-14
  • 3 回答
  • 0 關注
  • 484 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號