我直接建立了win32 application工程中编写的过程化程序,没有用MFC,我编写了winsocket程序,但是总提示一些头文件没有定义,或者什么函数重复地定义...两个代码如下(一个是server的,一个是client的):client端的程序:
//#include"windows.h"
#include <winsock2.h>
#include <sys/types.h>
#include <sys/mntent.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#pragma comment (lib,"ws2_32.lib")
#define USERPORT 10001
#define HOST_IP_ADDR "192.1.1.2"
main(int argc, char **argv)
{
char buf[1024];
struct sockaddr_in client;
struct sockaddr_in server;
int s;
int ns;
int namelen;
int pktlen;
if ((s=socket(AF_INET, SOCK_STREAM, 0))<0)
{
perror("Socket()");
return;
}
bzero((char *)&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(USERPORT);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *)&server, sizeof(server))<0)
{
perror("Bind()");
return;
}
if (listen(s,1)!=0)
{
perror("Listen()");
return;
}
namelen = sizeof(client);
if ((ns = accept(s, (struct sockaddr *)&client, &namelen)) ==-1)
{
perror("Accept()");
return;
}
for (;;)
{
if ((pktlen = recv(ns,buf,1024,0))<0)
{
perror("Recv()");
break;
}
else
if (pktlen == 0)
{
printf("Recv():return FAILED,connection is shut down!\n");
break;
}
else
printf("Recv():return SUCCESS,packet length = %d\n",pktlen);
sleep(1);
if (send(ns,buf,pktlen,0)<0)
{
perror("Send()");
break;
}
else
printf("Send():return SUCCESS,packet length = %d\n",pktlen);
}
close(ns);
close(s);
printf("Server ended successfully\n");
}
程序可能比较多,但是只是请问一下,不用MFC来编写WINsocket程序,需要设置什么或者连接什么?多谢了
//#include"windows.h"
#include <winsock2.h>
#include <sys/types.h>
#include <sys/mntent.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#pragma comment (lib,"ws2_32.lib")
#define USERPORT 10001
#define HOST_IP_ADDR "192.1.1.2"
main(int argc, char **argv)
{
char buf[1024];
struct sockaddr_in client;
struct sockaddr_in server;
int s;
int ns;
int namelen;
int pktlen;
if ((s=socket(AF_INET, SOCK_STREAM, 0))<0)
{
perror("Socket()");
return;
}
bzero((char *)&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(USERPORT);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *)&server, sizeof(server))<0)
{
perror("Bind()");
return;
}
if (listen(s,1)!=0)
{
perror("Listen()");
return;
}
namelen = sizeof(client);
if ((ns = accept(s, (struct sockaddr *)&client, &namelen)) ==-1)
{
perror("Accept()");
return;
}
for (;;)
{
if ((pktlen = recv(ns,buf,1024,0))<0)
{
perror("Recv()");
break;
}
else
if (pktlen == 0)
{
printf("Recv():return FAILED,connection is shut down!\n");
break;
}
else
printf("Recv():return SUCCESS,packet length = %d\n",pktlen);
sleep(1);
if (send(ns,buf,pktlen,0)<0)
{
perror("Send()");
break;
}
else
printf("Send():return SUCCESS,packet length = %d\n",pktlen);
}
close(ns);
close(s);
printf("Server ended successfully\n");
}
程序可能比较多,但是只是请问一下,不用MFC来编写WINsocket程序,需要设置什么或者连接什么?多谢了
//#include"windows.h"
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#define USERPORT 10001
#define IDM_START 101
#define IDM_EXIT 102
#define UM_SOCK WM_USER + 0X100
#include <alloc.h>
#include <mem.h>
#include <windows.h>
#include <winsock.h>
#define MAJOR_VERSION 1
#define MINOR_VERSION 2
#define WSA_MAKEWORD(x,y) ((y)*256+(x))
HANDLE hInst;
char server_address[256] = {0};
char buffer[1024];
char FAR * lpBuffer = &buffer[0];
SOCKET s = 0;
struct sockaddr_in dst_addr;
struct hostent far *hostaddr;
struct hostent hostnm;
struct servent far *sp;
int count = 0;
BOOL InitApplication(HINSTANCE hInstance);
long FAR PASCAL ClientProc(HWND hWnd, unsigned message, UINT wParam, LONG lParam);
void AlertUser(HWND hWnd, char *message);
BOOL Client(HWND hWnd);
BOOL ReceivePacket(HWND hWnd);
BOOL SetSelect(HWND hWnd, long lEvent);
BOOL SendPacket(HWND hWnd, int len);
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
lstrcpy((LPSTR)server_address, lpCmdLine);
if (!hPrevInstance)
if (!InitApplication(hInstance))
return (FALSE);
hInst = hInstance;
hWnd = CreateWindow("ClientClass", "Windows ECHO Client", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
return (FALSE);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
PostMessage(hWnd, WM_USER, (WPARAM)0, (LPARAM)0);
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS WndClass;
char *szAppName = "ClientClass";
// fill in window class information
WndClass.lpszClassName = (LPSTR)szAppName;
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = ClientProc;
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(hInstance, NULL);
WndClass.lpszMenuName = "ClientMenu";
WndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
// register the class
if (!RegisterClass(&WndClass))
return(FALSE);
return(TRUE);
}
long FAR PASCAL ClientProc(HWND hWnd, unsigned message, UINT wParam, LONG lParam)
{
int length, i;
WSADATA wsaData;
int Status;
switch (message)
{
case WM_USER:
{
WORD wMajorVersion, wMinorVersion;
LPWSADATA lpmyWSAData;
WORD VersionReqd;
int ret; 等等...............................内容太长,发不上去,请你只是看下头文件怎么设置(如果不用MFC的话..) }
#include <winsock2.h>
我写网络程序只用到这两个就行了我用的是VC6+Winsocket不用MFC封装的socket。
c:\documents and settings\administrator\桌面\server\0.cpp(4) : fatal error C1083: Cannot open include file: 'sys/mntent.h': No such file or directory
Error executing cl.exe.
如果有include"windows.h"的话错误是:
..........................
d:\vc98\include\winsock.h(793) : see declaration of 'WSASetBlockingHook'
d:\vc98\include\winsock2.h(2158) : error C2375: 'WSACancelBlockingCall' : redefinition; different linkage
d:\vc98\include\winsock.h(795) : see declaration of 'WSACancelBlockingCall'
d:\vc98\include\winsock2.h(2180) : error C2375: 'WSAAsyncGetServByName' : redefinition; different linkage
d:\vc98\include\winsock.h(797) : see declaration of 'WSAAsyncGetServByName'
d:\vc98\include\winsock2.h(2207) : error C2375: 'WSAAsyncGetServByPort' : redefinition; different linkage
d:\vc98\include\winsock.h(802) : see declaration of 'WSAAsyncGetServByPort'
d:\vc98\include\winsock2.h(2233) : error C2375: 'WSAAsyncGetProtoByName' : redefinition; different linkage
d:\vc98\include\winsock.h(806) : see declaration of 'WSAAsyncGetProtoByName'
d:\vc98\include\winsock2.h(2258) : error C2375: 'WSAAsyncGetProtoByNumber' : redefinition; different linkage
d:\vc98\include\winsock.h(810) : see declaration of 'WSAAsyncGetProtoByNumber'
d:\vc98\include\winsock2.h(2283) : error C2375: 'WSAAsyncGetHostByName' : redefinition; different linkage
d:\vc98\include\winsock.h(814) : see declaration of 'WSAAsyncGetHostByName'
d:\vc98\include\winsock2.h(2310) : error C2375: 'WSAAsyncGetHostByAddr' : redefinition; different linkage
d:\vc98\include\winsock.h(818) : see declaration of 'WSAAsyncGetHostByAddr'
d:\vc98\include\winsock2.h(2333) : error C2375: 'WSACancelAsyncRequest' : redefinition; different linkage
d:\vc98\include\winsock.h(822) : see declaration of 'WSACancelAsyncRequest'
d:\vc98\include\winsock2.h(2353) : error C2375: 'WSAAsyncSelect' : redefinition; different linkage
d:\vc98\include\winsock.h(824) : see declaration of 'WSAAsyncSelect'
c:\documents and settings\administrator\桌面\server\0.cpp(4) : fatal error C1083: Cannot open include file: 'sys/mntent.h': No such file or directory
Error executing cl.exe.0.obj - 59 error(s), 11 warning(s)
//#include <winsock2.h>
#include <sys/types.h>
#include <sys/mntent.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
//#pragma comment (lib,"ws2_32.lib")或者
//#include"windows.h"
#include <winsock2.h>
#include <sys/types.h>
#include <sys/mntent.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#pragma comment (lib,"ws2_32.lib")
错误都是: fatal error C1083: Cannot open include file: 'sys/mntent.h': No such file or directory
如果#include"windows.h"
#include <winsock2.h>同时用的话,就 有59个重复定义的错误.....
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <sys/mntent.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h> --这些都是linux等平台上的,不是windows的
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
先写成这样,把其它包含都去掉,看看有什么错,再增加相应的头文件。
同样提示 fatal error C1083: Cannot open include file: 'alloc.h': No such file or directory
如果加上#include“windows.h",就又是59个错误了...
#if(_WIN32_WINNT >= 0x0400)
#include <winsock2.h>
#include <mswsock.h>
#else
#include <winsock.h>
#endif //USES_ACE
#endif /* _WIN32_WINNT >= 0x0400 */摘自windows.h可以看到如果使用了WSASend此类winsock2的功能是需要定义WINNT版本的至于USES_ACE是我自己定义的便于使用ACE库弄得你可以不必理会
/* scompat.h for Windows Developers Journal by Victor R. Volkman
this code may be used freely with no restrictions on use */#ifndef _WIN32
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <errno.h>
#define SOCKET int
#define INVALID_SOCKET -1
#define LPVOID void *
#define HANDLE int
#define closesocket close
#else
#include <winsock.h>
#endif
/* Scompat.c for Windows Developers Journal by Victor R. Volkman
* this code may be used freely with no restrictions on use
*
* Winsock compatability layer for Unix
*/#ifdef _WIN32
#include <winsock.h>
#else
#include <errno.h>
#endif#include <stdio.h>int InitSockets(void)
{
#ifdef _WIN32
WSADATA wsaData;
WORD wVersionRequested;
int err; /* Ask for Winsock 1.1 functionality */
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("Error %d: Winsock not available\n", err);
return 1;
}
#endif
return 0;
}#ifndef _WIN32
int WSAGetLastError(void)
{
return errno;
}int WSACleanup(void)
{
return 0;
}#endif
/* Server1.c for Windows Developers Journal by Victor R. Volkman
* this code may be used freely with no restrictions on use
*
* To build Win32 server cl server1.c scompat.c /Z7 /MT
* To build Unix server cc server1.c scompat.c -o server1
*/#include <stdio.h>
#include "scompat.h"/* try to tell linker where WinSock library is */
#if defined(_MSC_VER)
# pragma comment(lib,"wsock32.lib")
#elif defined(__BORLANDC__)
# pragma comment(lib,"mswsock.lib")
#endif#define WSA_ERROR(x) { printf("Error %d: %s\n", \
WSAGetLastError(), x); return 1; }int ServerLoop(SOCKET sd_listen, int isMultiTasking);main(int argc, char **argv)
{
SOCKET sd_listen;
int err;
u_short iPort;
struct sockaddr_in addr_srv;
struct hostent *ptrHost;
char *pszHost = "152.160.13.253"; iPort = (argc >= 2) ? atoi(argv[1]) : 9999; InitSockets();
sd_listen = socket(PF_INET, SOCK_STREAM, 0);
if (sd_listen == INVALID_SOCKET) {
printf("Error: out of socket resources\n");
return 1;
}
if (atoi(pszHost)) {
u_long ip_addr = inet_addr(pszHost);
ptrHost = gethostbyaddr((char *)&ip_addr,
sizeof(u_long), AF_INET);
}
else
ptrHost = gethostbyname(pszHost); if (!ptrHost)
WSA_ERROR("cannot resolve hostname") addr_srv.sin_family = PF_INET;
addr_srv.sin_addr.s_addr = htonl(INADDR_ANY);
addr_srv.sin_port = htons(iPort); err = bind(sd_listen, (const struct sockaddr *) &addr_srv,
sizeof(addr_srv));
if (err == INVALID_SOCKET)
WSA_ERROR("Error: unable to bind socket\n") err = listen(sd_listen, SOMAXCONN);
if (err == INVALID_SOCKET)
WSA_ERROR("Error: listen failed\n") ServerLoop(sd_listen, 1);
printf("Server is down\n");
WSACleanup();
return 0;
}
void ServeAClient(LPVOID lpv)
{
SOCKET sd_accept = (SOCKET) lpv;
const char *msg = "HELLO CLIENT";
char response[4096]; memset(response, 0, sizeof(response));
recv(sd_accept, response, sizeof(response), 0);
if (strcmp(response, "HELLO SERVER")) {
printf("Application: client not using expected "
"protocol %s\n", response);
}
else
send (sd_accept, msg, strlen(msg)+1, 0);
closesocket(sd_accept);
}#define MAX_SERVED 3int ServerLoop(SOCKET sd_listen, int isMultiTasking)
{
SOCKET sd_accept;
struct sockaddr_in addr_client;
int err, nSize;
int numServed = 0;
HANDLE handles[MAX_SERVED];
int myID; while (numServed < MAX_SERVED) { nSize = sizeof(addr_client);
sd_accept = accept(sd_listen, (struct sockaddr *)
&addr_client, &nSize);
if (sd_accept == INVALID_SOCKET)
WSA_ERROR("Error: accept failed\n") printf("Accepted connection from client at %s\n",
inet_ntoa(addr_client.sin_addr));
if (isMultiTasking) {
#ifdef _WIN32
handles[numServed] = CreateThread(NULL, 1000,
(LPTHREAD_START_ROUTINE)ServeAClient,
(LPVOID) sd_accept, 0, &myID);
#else
myID = fork();
if (myID == 0) { /* I am child process */
ServeAClient ((LPVOID) sd_accept);
exit(0);
}
handles[numServed] = myID;
#endif
}
else
ServeAClient((LPVOID) sd_accept);
numServed++;
} if (isMultiTasking) {
#ifdef _WIN32
err = WaitForMultipleObjects(MAX_SERVED, handles,
TRUE, INFINITE);
printf("Last thread to finish was thread #%d\n", err);
#endif
}
return 0;
}
/* Client1.c for Windows Developers Journal by Victor R. Volkman
* this code may be used freely with no restrictions on use
*
* To build Win32 client cl client1.c scompat.c /Z7 /MT
* To build Unix client cc client1.c scompat.c -o client1
*/#include <stdio.h>
#include "scompat.h"/* try to tell linker where WinSock library is */
#if defined(_MSC_VER)
# pragma comment(lib,"wsock32.lib")
#elif defined(__BORLANDC__)
# pragma comment(lib,"mswsock.lib")
#endif
#define WSA_ERROR(x) { printf("Error %d: %s\n", \
WSAGetLastError(), x); return 1; }
void InitSockets(void);
main(int argc, char **argv)
{
SOCKET sd_client;
int err;
u_short iPort;
struct sockaddr_in addr_srv;
struct hostent *ptrHost;
char response[4096];
char *pszHost;
char *msg = "HELLO SERVER"; if (argc == 3) {
pszHost = argv[1];
iPort = atoi(argv[2]);
}
else {
printf("Usage:\t client1 [hostname] [portno]");
return 1;
} InitSockets();
sd_client = socket(PF_INET, SOCK_STREAM, 0);
if (sd_client == INVALID_SOCKET)
WSA_ERROR("no more socket resources") if (atoi(pszHost)) {
u_long ip_addr = inet_addr(pszHost);
ptrHost = gethostbyaddr((char *)&ip_addr,
sizeof(u_long), AF_INET);
}
else
ptrHost = gethostbyname(pszHost); if (!ptrHost)
WSA_ERROR("cannot resolve hostname") addr_srv.sin_family = PF_INET;
memcpy((char *) &(addr_srv.sin_addr),
ptrHost->h_addr, ptrHost->h_length);
addr_srv.sin_port = htons(iPort); err = connect(sd_client, (struct sockaddr *) &addr_srv,
sizeof(addr_srv));
if (err == INVALID_SOCKET)
WSA_ERROR("cannot connect to server") printf("You are connected to the server\n");
send (sd_client, msg, strlen(msg)+1, 0);
memset(response, 0, sizeof(response));
recv(sd_client, response, sizeof(response), 0);
printf("server says %s\n", response);
closesocket(sd_client);
WSACleanup();
return 0;
}
c.obj : error LNK2001: unresolved external symbol "void __cdecl InitSockets(void)" (?InitSockets@@YAXXZ)
Debug/cccc.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.cccc.exe - 2 error(s), 0 warning(s)
这是楼上程序出现的错误提示...
#include <sys/mntent.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
是LINUX头文件,你去了#ifndef
#include <windows.h> 若不跨平台先注释掉linux下采用到的文件
当然如果你用了其他的东西就要其他的文件头,不过socket的上面两个就够了