新手求助 codeblocks10.05怎么编译winsocket程序呀????
codeblocks吧
全部回复
仅看楼主
level 1
konew 楼主
最近在学习tcp和udp程序,MSDN上的两个程序tcp客户端和服务器的程序 。但是在codeblock上不能编译成功 总是说有:sockaddr_in 和 RecvAddr 没定义
听别人说 在linker setting加一个libws2_32.a的库 但是还是没什么用
不知道 有没有高手知道 该怎么 修改codeblock的配置 使它能运行windows程序?????
下面是那个MSDN上的 范例程序 有没有高手看看 还有什么要修改的???
2012年11月05日 13点11分 1
level 1
konew 楼主

这是那个程序 应该没问题
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int main()
{
int iResult;
WSADATA wsaData;
SOCKET SendSocket = INVALID_SOCKET;
sockaddr_in RecvAddr;
unsigned
short Port = 27015;
char SendBuf[1024];
int BufLen = 1024;
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L
"WSAStartup failed with error: %d\n", iResult);
return 1;
}
//---------------------------------------------
// Create a socket for sending data
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (SendSocket == INVALID_SOCKET) {
wprintf(L
"socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
//---------------------------------------------
// Set up the RecvAddr structure with the IP address of
// the receiver (in this example case "192.168.1.1")
// and the specified port number.
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(Port);
RecvAddr.sin_addr.s_addr = inet_addr(
"192.168.1.1");
//---------------------------------------------
// Send a datagram to the receiver
wprintf(L
"Sending a datagram to the receiver...\n");
iResult = sendto(SendSocket,
SendBuf, BufLen, 0, (SOCKADDR *) & RecvAddr,
sizeof (RecvAddr));
if (iResult == SOCKET_ERROR) {
wprintf(L
"sendto failed with error: %d\n", WSAGetLastError());
closesocket(SendSocket);
WSACleanup();
return 1;
}
//---------------------------------------------
// When the application is finished sending, close the socket.
wprintf(L
"Finished sending. Closing socket.\n");
iResult = closesocket(SendSocket);
if (iResult == SOCKET_ERROR) {
wprintf(L
"closesocket failed with error: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
//---------------------------------------------
// Clean up and quit.
wprintf(L
"Exiting.\n");
WSACleanup();
return 0;
}

2012年11月05日 13点11分 2
level 11
codeblocks建立一个console C++工程,将上面代码拷贝覆盖缺省的main.cpp
注释掉
#pragma
comment(lib, "Ws2_32.lib") - gcc并不支持这样的做法,编译时会自动被忽略掉(如果你在codeblocks还是用vc编译器,那就无所谓了)
在linker setting里添加Ws2_32
BTW,mingw能够很好支持win32 SDK开发,并不需要特别的设定什么

2012年11月06日 00点11分 3
谢谢!!! 之后又发现sockaddr_in 需要在前面加一个struct关键字。不过还是谢谢你
2012年11月07日 06点11分
回复 konew : 你估计用的C吧,并且可能还不支持c99,定义结构变量,需要加struct。如果是c99,或者C++,结构名就是真正的数据类型,用来定义变量不需要额外加struct关键字。。。
2012年11月08日 00点11分
level 7
加libws2_32.a就可以么?
2016年05月31日 04点05分 4
1