Socket代码改错,该如何解决
发布时间:2011-06-23 14:27:28 文章来源:www.iduyao.cn 采编人员:星星草
Socket代码改错
刚弄的daytime协议实现的小程序。但开两个VS用127.0.0.1IP运行客户端一闪就没了,服务器没消失,显示有一个客户端连接了,找不到错,求高手指点啊。附上代码。
服务器:#include "stdafx.h"
#include <stdlib.h>
#include <errno.h>
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#include <time.h>
#define MAX_BUFFER 1024
#define DAYTIME_SERVER_PORT 13
int main()
{
int serverFd,connectionFd,i = 1;
struct sockaddr_in servaddr;
char timebuffer[MAX_BUFFER + 1];
time_t currentTime;
WSADATA wsaData;
if (WSAStartup( MAKEWORD(2,2), &wsaData ) == SOCKET_ERROR)
{
printf("命令套接字初始化失败\n");
return -1;
}
serverFd = socket(AF_INET, SOCK_STREAM,0);
if(serverFd == -1)
{
printf("socket error!\n");
return(-1);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(DAYTIME_SERVER_PORT);
bind(serverFd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(serverFd,5);
while(1)
{
connectionFd = accept(serverFd, (struct sockaddr *)NULL, NULL);
if(connectionFd >=0)
{
currentTime = time(NULL);
sprintf(timebuffer, "%s\n", ctime(¤tTime));
printf("出现%d个搞不清时间的家伙\n",i++);
send(connectionFd, timebuffer, strlen(timebuffer),0);
closesocket(connectionFd);
}
}
return 1;
}
客户端:#include "stdafx.h"
#include <stdlib.h>
#include <errno.h>
#include "winsock2.h"
#include <stdio.h>
#include <time.h>
#pragma comment(lib,"ws2_32.lib")
#define MAX_BUFFER 1024
#define DAYTIME_SERVER_PORT 13
int main(void)
{
int connectionFd, in;
struct sockaddr_in servaddr;
char timebuffer[MAX_BUFFER +1];
WSADATA wsaData;
if (WSAStartup( MAKEWORD(2,2), &wsaData ) == SOCKET_ERROR)
{
printf("命令套接字初始化失败\n");
return -1;
}
connectionFd = socket(AF_INET,SOCK_STREAM,0);
if(connectionFd == -1)
{
printf("socket error!\n");
return(-1);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(DAYTIME_SERVER_PORT);
//inet_addr()把字符串形式的IP地址转换成unsigned long型的整数值
servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(connectionFd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while((in = recv(connectionFd, timebuffer, MAX_BUFFER, 0))>0)
{
timebuffer[in] =0;
printf("\n%s",timebuffer);
}
closesocket(connectionFd);
return(0);
}
另外winsock2.h与windows.h头文件包含问题,网上搜到的解决方法是定义宏#define WIN32_LEAN_AND_MEAN。但是我修改之后发现想要实现的在Socket套接字编程客户端发送信息给服务器附带自动发送客户端IP的功能无法实现,在CSDN上搜到的解决方法也大同小异,求指点啊。
------解决方案--------------------
while((in = recv(connectionFd, timebuffer, MAX_BUFFER, 0))>0)
{
timebuffer[in] =0;
printf("\n%s",timebuffer);
}
客户端的这个代码根本没用,服务器端发完就立马关闭socket,直接用if就可以。
而且只收发一次,你客户端肯定是收完后就立马结束了
现象没问题。要看你程序输出,加上进程id看两个进程的输出是否正常
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
关于visual studio 2005的工程文件*.vcproj的问题
请问:Visual Studio 2005 新建一个工程之后,会自动生产一个*.vcproj的一个文件,这...
-
用MFC画图的问题
我现在要用随机数产生300个固定的点保存在数组中,并在ondraw里画出这300个点,而且通过定时器使这300个点做运动。...
-
VS2010中的C++怎么连接数据库?
之前一直用VC++6.0的、现在想学学用最新的VS、但是感觉连接数据库和之前不一样了、具体应该怎么弄...
-
CLI编程 高手帮忙
我现在用C++/CLI 混编,
我有一个方法, 是调用一个C 的类库 得到一个 char * 的值
现在我...
-
新手求教::VC.NET2003里面的"添加变量"菜单变灰了,怎么弄?
最近学着用.net写程序,以前用的是6.0,不知道为什么我设计的EDIT Con...
-
刚学习vc.net 请教一个String做参数的问题,请高手指教一下
下面的代码为什么不能编译呢,出现这个错误呢
.\clr.cpp(12) : error C3...
-
VS2003中通过ADO取SQL2003中bigint 负值变正值的问题,求助!
在SQL2003中 数据库中假设 一个bigint类型的数据位-1234这样的值,通过如...
-
新手学习VC用那个版本的编译器好!
新手学习VC用那个版本的编译器好!?
------解决方案--------------------
VC++6.0
------解决...
-
正则表达式
有这样的字符串
"1,',2"",3"
希望将单个的"替换成单引号,将连续两个的""替换成一个双引号。
正则表达式该如何写。
...
-
为什么<<精通MFC>>附带的源程序不能编译成功
vc2010编译后有两个错误提示,分别如下,
错误一:
1>c:\program files\microsoft vi...