/**** get port number from service ****/ if( pse=getservbyname(service,transport) ) sin.sin_port=pse->s_port; /* port */ else if( (sin.sin_port=htons( (u_short)atoi(service)))==0) { printf("get server information error \n"); WSACleanup(); exit(1); }
/**** get IP address from host name ****/ if(phe=gethostbyname(host)) memcpy(&sin.sin_addr,phe->h_addr,phe->h_length); /* host IP address */ else if( (sin.sin_addr.s_addr=inet_addr(host))==INADDR_NONE ) { printf("get host IP information error \n"); WSACleanup(); exit(1); }
/**** get protocol number from protocol name ****/ if( (ppe=getprotobyname(transport))==0) { printf("get protocol information error \n"); WSACleanup(); exit(1); }
if(strcmp(transport,"udp")==0) type=SOCK_DGRAM; else type=SOCK_STREAM; /**** creat a socket description ****/ s=socket(PF_INET,type,ppe->p_proto);
/* get portnumber from service name */ if(pse=getservbyname(service,transport) ) sin.sin_port=htons(ntohs((u_short)pse->s_port)); else if( (sin.sin_port=htons((u_short)atoi(service)))==0) { printf(" get portnumber error \n"); WSACleanup(); exit(1); }
/* get protocol number from protocol name */ if((ppe=getprotobyname(transport))==0) { printf(" get protocol number error \n"); WSACleanup(); exit(1); }
/* choose socket type */ if(strcmp(transport,"udp")==0) type=SOCK_DGRAM; else type=SOCK_STREAM;
至少说明是app不能调还是dll不能调,是线程里面出问题还是socket通讯的时候出问题啊
连提问都不会啊
运行过程应该是先运行server.exe,再运行client.exe,现在问题是,在vc中我要先启动 server.cpp,但我无法单步调试,说好像无debug信息。
我如果想单步调试,却不行。:(help
1.先建立客户端公共函数文件connect_client.c,作用是建立sock,准备连接服务器端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock.h>#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endifSOCKET sockconnect(const char *host,const char *service,const char *transport);/*-------------------------------------------------------------------------
*connectUDP
*-------------------------------------------------------------------------
*/
SOCKET
UDPconnect(const char *host,const char *service)
{
return sockconnect(host,service,"udp");
}/*-------------------------------------------------------------------------
*connectTCP
*-------------------------------------------------------------------------
*/
SOCKET
TCPconnect(const char *host,const char *service)
{
return sockconnect(host,service,"tcp");
}/*-------------------------------------------------------------------------
*
*-------------------------------------------------------------------------
*/
SOCKET
sockconnect(const char *host,const char *service,const char *transport)
{
struct hostent *phe; /*host information */
struct servent *pse; /* server information */
struct protoent *ppe; /*protocol information */
struct sockaddr_in sin; /*endpoint IP address */
int s, type; /* socket description */ memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
/**** get port number from service ****/
if( pse=getservbyname(service,transport) )
sin.sin_port=pse->s_port; /* port */
else if( (sin.sin_port=htons( (u_short)atoi(service)))==0)
{
printf("get server information error \n");
WSACleanup();
exit(1);
}
/**** get IP address from host name ****/
if(phe=gethostbyname(host))
memcpy(&sin.sin_addr,phe->h_addr,phe->h_length); /* host IP address */
else if( (sin.sin_addr.s_addr=inet_addr(host))==INADDR_NONE )
{
printf("get host IP information error \n");
WSACleanup();
exit(1);
}
/**** get protocol number from protocol name ****/
if( (ppe=getprotobyname(transport))==0)
{
printf("get protocol information error \n");
WSACleanup();
exit(1);
}
if(strcmp(transport,"udp")==0)
type=SOCK_DGRAM;
else
type=SOCK_STREAM;
/**** creat a socket description ****/
s=socket(PF_INET,type,ppe->p_proto);
if( s==INVALID_SOCKET)
{
printf(" creat socket error \n");
WSACleanup();
exit(1);
}
if( connect(s,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR )
{
printf("connect socket error \n");
WSACleanup();
exit(1);
} return s;
}
----------------------------------
2.新建客户端win32控制台工程,文件为client.cpp,并包含上述的客户端公共函数文件.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock.h>
#include "connect_client.C"
#pragma comment(lib,"wsock32")#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
SOCKET TCPconnect(const char *,const char *);
void TCPecho(char *,char *);#define LINELEN 128
#define WAVERS MAKEWORD(2,0)
void main(int argc,char *argv[])
{
char *host = "localhost";
char *service = "3333";
WSADATA wsadata;
switch(argc)
{
case 1 :
host= "localhost";
break;
case 2 :
host=argv[1];
break;
case 3:
host=argv[1];
service=argv[2];
break;
default:
printf("argment error\n");
exit(1);
} if(WSAStartup(WAVERS,&wsadata)!=0)
{
printf("initalize failed\n");
WSACleanup();
exit(1);
}
/********************/
TCPecho(host,service);
/********************/
WSACleanup();
exit(0);
}void TCPecho(char *host,char *service)
{
char buf[LINELEN+1];
SOCKET s;
int outchars;
s = TCPconnect(host,service);
while(fgets(buf,sizeof(buf),stdin))
{
buf[LINELEN]='\0';
outchars=strlen(buf);
send(s,buf,outchars,0); if(buf[0]=='\n')
break;
}
closesocket(s);}
3.建立服务器端公共函数文件passive_server.C,作用是建立sock,监听客户端连接。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <winsock.h>u_short portbase = 0 ;SOCKET sockserver(const char *service,const char *transport,int qlen); /*-------------------------------------------------------------------
* udppassive
*-------------------------------------------------------------------
*/
SOCKET
UDPserver(const char *service)
{
return sockserver(service,"udp",0);
}
/*-------------------------------------------------------------------
* tcppassive
*-------------------------------------------------------------------
*/
SOCKET
TCPserver(const char *service,int qlen)
{
return sockserver(service,"tcp",qlen);
}
/*-------------------------------------------------------------------
*
*-------------------------------------------------------------------
*/
SOCKET
sockserver(const char *service,const char *transport,int qlen)
{
struct servent *pse; /* server information */
struct protoent *ppe; /* proto information */
struct sockaddr_in sin; /* endpoint IP address */
int s,type; /* socket description */
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
/* get portnumber from service name */
if(pse=getservbyname(service,transport) )
sin.sin_port=htons(ntohs((u_short)pse->s_port));
else if( (sin.sin_port=htons((u_short)atoi(service)))==0)
{
printf(" get portnumber error \n");
WSACleanup();
exit(1);
}
/* get protocol number from protocol name */
if((ppe=getprotobyname(transport))==0)
{
printf(" get protocol number error \n");
WSACleanup();
exit(1);
}
/* choose socket type */
if(strcmp(transport,"udp")==0)
type=SOCK_DGRAM;
else
type=SOCK_STREAM;
s=socket(PF_INET,type,ppe->p_proto);
if( s==INVALID_SOCKET)
{
printf(" creat socket error \n");
WSACleanup();
exit(1);
}
if(bind(s,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR )
{
printf(" socket bind error \n");
WSACleanup();
exit(1);
}
if(type==SOCK_STREAM && listen(s,qlen)==SOCKET_ERROR)
{
printf(" socket listen error \n");
WSACleanup();
exit(1);
} return s;
}
---------------
4.新建一个win32工程,添加服务器端主函数文件server.cpp
#include <winsock.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "passive_server.C"
#pragma comment(lib,"wsock32")#define QLEN 5
#define BUFSIZE 2048
#define WAVERS MAKEWORD(2,0)SOCKET TCPserver(const char *service,int qlen);void main(int argc,char *argv[])
{
char *service = "3333";
struct sockaddr_in fsin;
SOCKET msock,ssock;
WSADATA wsadata;
int alen,cc;
char buf[BUFSIZE];
switch(argc)
{
case 1:
break;
case 2:
service=argv[1];
break;
default:
printf("argment error\n");
exit(1);
}
if(WSAStartup(WAVERS,&wsadata)!=0)
{
printf("initalize failed\n");
WSACleanup();
exit(1);
}
msock=TCPserver(service,QLEN);
while(1){
alen=sizeof(struct sockaddr);
ssock=accept(msock,(struct sockaddr *)&fsin,&alen);
if(ssock==INVALID_SOCKET)
{
printf("initalize failed\n");
WSACleanup();
exit(1);
}
buf[0]='\n';
while( cc=recv(ssock,buf,sizeof(buf)-1,0) ){
buf[cc]='\0';
printf("%s",buf);
}
printf("connect close... ");
closesocket(ssock);
break; }
}
-------------------------------------------
运行步骤,先运行服务器端文件server.cpp,然后运行客户端文件client.cpp
在客户端的窗口里输入一些文字,则会在服务器端的窗口里显示。
连续输入两个回车,则退出程序。