C++ 套接字程序Python vs C++;(温索克)
我有一个python程序,它非常适合于网络聊天。但是,C++上类似的套接字上的程序不能在Internet上运行。 Python程序C++ 套接字程序Python vs C++;(温索克),c++,python,sockets,winsock,C++,Python,Sockets,Winsock,我有一个python程序,它非常适合于网络聊天。但是,C++上类似的套接字上的程序不能在Internet上运行。 Python程序 import thread import socket class p2p: def __init__(self): socket.setdefaulttimeout(50) self.port = 3000 #Destination IP HERE self.peerId = '59.9
import thread
import socket
class p2p:
def __init__(self):
socket.setdefaulttimeout(50)
self.port = 3000
#Destination IP HERE
self.peerId = '59.95.18.156'
#declaring sender socket
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
self.socket.bind(('', self.port))
self.socket.settimeout(50)
#starting thread for reception
thread.start_new_thread(self.receiveData, ())
while 1:
data=raw_input('>')
#print 'sending...'+data
self.sendData(data)
def receiveData(self):
while 1:
data,address=self.socket.recvfrom(1024)
print data
def sendData(self,data):
self.socket.sendto(data, (self.peerId,self.port))
if __name__=='__main__':
print 'Started......'
p2p()
<>我想在C++中构建类似的功能。我从MSDN获取了服务器和客户端程序。但他们只在本地主机上工作,不在互联网上工作。。
它们如下
寄件人
#include <stdio.h>
#include "winsock2.h"
void main() {
WSADATA wsaData;
SOCKET SendSocket;
sockaddr_in RecvAddr;
int Port = 3000;
char SendBuf[3]={'a','2','\0'};
int BufLen = 3;
//---------------------------------------------
// Initialize Winsock
WSAStartup(MAKEWORD(2,2), &wsaData);
//---------------------------------------------
// Create a socket for sending data
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//---------------------------------------------
// Set up the RecvAddr structure with the IP address of
// the receiver (in this example case "123.456.789.1")
// and the specified port number.
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(Port);
RecvAddr.sin_addr.s_addr = inet_addr("59.95.18.156");
//---------------------------------------------
// Send a datagram to the receiver
printf("Sending a datagram to the receiver...\n");
sendto(SendSocket,
SendBuf,
BufLen,
0,
(SOCKADDR *) &RecvAddr,
sizeof(RecvAddr));
//---------------------------------------------
// When the application is finished sending, close the socket.
printf("Finished sending. Closing socket.\n");
closesocket(SendSocket);
//---------------------------------------------
// Clean up and quit.
printf("Exiting.\n");
WSACleanup();
return;
}
#包括
#包括“winsock2.h”
void main(){
WSADATA WSADATA;
套接字发送套接字;
RecvAddr中的sockaddr_;
int端口=3000;
char SendBuf[3]={'a','2','\0'};
int-BufLen=3;
//---------------------------------------------
//初始化Winsock
WSAStartup(MAKEWORD(2,2)和wsaData);
//---------------------------------------------
//创建用于发送数据的套接字
SendSocket=套接字(自动网络、套接字数据RAM、IP协议UDP);
//---------------------------------------------
//设置IP地址为的RecvAddr结构
//接收器(在本例中为“123.456.789.1”)
//和指定的端口号。
RecvAddr.sin_family=AF_INET;
RecvAddr.sinu port=htons(端口);
RecvAddr.sin_addr.s_addr=inet_addr(“59.95.18.156”);
//---------------------------------------------
//向接收器发送数据报
printf(“向接收器发送数据报…\n”);
sendto(SendSocket,
森布夫,
布弗伦,
0,
(SOCKADDR*)和RecvAddr,
sizeof(RecvAddr));
//---------------------------------------------
//当应用程序完成发送后,关闭套接字。
printf(“已完成发送。正在关闭套接字。\n”);
闭合插座(SendSocket);
//---------------------------------------------
//清理并退出。
printf(“正在退出。\n”);
WSACleanup();
返回;
}
接受者
#include <stdio.h>
#include "winsock2.h"
#include<iostream>
using namespace std;
void main() {
WSADATA wsaData;
SOCKET RecvSocket;
sockaddr_in RecvAddr;
int Port = 3000;
char RecvBuf[3];
int BufLen = 3;
sockaddr_in SenderAddr;
int SenderAddrSize = sizeof(SenderAddr);
//-----------------------------------------------
// Initialize Winsock
WSAStartup(MAKEWORD(2,2), &wsaData);
//-----------------------------------------------
// Create a receiver socket to receive datagrams
RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//-----------------------------------------------
// Bind the socket to any address and the specified port.
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(Port);
RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
//-----------------------------------------------
// Call the recvfrom function to receive datagrams
// on the bound socket.
printf("Receiving datagrams...\n");
while(true){
recvfrom(RecvSocket,
RecvBuf,
BufLen,
0,
(SOCKADDR *)&SenderAddr,
&SenderAddrSize);
cout<<RecvBuf;
}
//-----------------------------------------------
// Close the socket when finished receiving datagrams
printf("Finished receiving. Closing socket.\n");
closesocket(RecvSocket);
//-----------------------------------------------
// Clean up and exit.
printf("Exiting.\n");
WSACleanup();
return;
}
#包括
#包括“winsock2.h”
#包括
使用名称空间std;
void main(){
WSADATA WSADATA;
插座插座;
RecvAddr中的sockaddr_;
int端口=3000;
char-RecvBuf[3];
int-BufLen=3;
SenderAddr中的sockaddr_;
int SenderAddrSize=sizeof(SenderAddr);
//-----------------------------------------------
//初始化Winsock
WSAStartup(MAKEWORD(2,2)和wsaData);
//-----------------------------------------------
//创建接收器套接字以接收数据报
RecvSocket=插座(AF_INET、SOCK_DGRAM、IPPROTO_UDP);
//-----------------------------------------------
//将套接字绑定到任何地址和指定端口。
RecvAddr.sin_family=AF_INET;
RecvAddr.sinu port=htons(端口);
RecvAddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
绑定(RecvSocket,(SOCKADDR*)和RecvAddr,sizeof(RecvAddr));
//-----------------------------------------------
//调用recvfrom函数以接收数据报
//在绑定的套接字上。
printf(“接收数据报…\n”);
while(true){
recvfrom(RecvSocket,
RecvBuf,
布弗伦,
0,
(SOCKADDR*)和SenderAddr,
&SenderAddressSize);
coutPer,sendto
返回一个大于0的数字(发送的字节数)表示成功,