代码如下,在VC++6.0中编译连接都没问题,就是在遍历txt文件用strstr函数时会出现问题,直接停止运行,求大神指点!!!万分感谢!!!!
//#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#define SERVER_PORT 5432
#define MAX_PENDING 5
#define MAX_LINE 256
#define true 1
#define false 0
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSADATA WSAData;
int WSAreturn;
/* server address */
struct sockaddr_in sin;
struct sockaddr_in remote;
char buf[MAX_LINE];
int len;
int s, new_s;
char line[MAX_LINE]; //读取到的每一行
FILE *fp; /*文件指针*/
//char ans[MAX_LINE];
//bool flag;
char * b;
//int l;
WSAreturn = WSAStartup(0x101,&WSAData);
if(WSAreturn)
{
fprintf(stderr, "simplex-talk: WSA error.\n"); //格式化输出至出错文件stderr
exit(1);
}
/* build address data structure */
memset((char *)&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(SERVER_PORT);
//服务器端在listen之前会调用bind(),而客户端就不用调用,在connect()时由系统随机生成一个。
/* setup passive open */
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {//socket函数创建一个socket描述符(socket descriptor),它唯一标识一个socket。
perror("simplex-talk: socket failed."); // s 为socket描述字
exit(1);
}
if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0) {//bind函数把一个地址族中的特定地址赋给socket
perror("simplex-talk: bind failed."); //sin 一个const struct sockaddr *指针,指向要绑定给s的协议地址
exit(1); //sizeof(sin) 地址长度
}
printf("server is ready in listening ...\n"); //服务器监听socket,客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。
listen(s, MAX_PENDING);
/* wait for connection, then receive and print text */
while(1) {
len = sizeof(struct sockaddr_in);
if ((new_s = accept(s, (struct sockaddr *)&remote, &len)) < 0){ //服务器用accept接收客户端的连接请求
perror("simplex-talk: accept failed."); //服务器与客户已经建立连接,
//可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信.
exit(1);
}
//printf("received a connection from %s : \n", inet_ntoa(remote.sin_addr));
while (len = recv(new_s, buf, sizeof(buf), 0)) { //int recv( SOCKET s, char FAR *buf, int len, int flags);
//printf("received %2d chars:", len); //第一个参数指定 接收端套接字描述符 即s;
printf("客户端: ");
fputs(buf, stdout); //第二个参数指明一个缓冲区用来存放recv函数接收到的数据;
//fputs将该字符串写入文件stdout,但并不写入结尾的'\0'。 //第三个参数指明buf的参数 第四个参数一般置0。
//在datafile中遍历得出答案,并放入缓冲区。
//strcpy(buf,reply(buf));
fp = fopen("C:\\Users\\user\\Desktop\\chatfile.txt","r")
if(fp == NULL)
{
perror("打开失败!");
exit(1);
}
int l=strlen(buf);
// bool flag;
//char * b;
while(fgets(line,sizeof(line),fp))
{
if(!strstr(line,buf)){
//flag = false;
//printf("测试");
}
else{
// flag = true;
if(line[l]==' '||line[l]==' '){
b=strstr(line," ");
break;
}
else{
//flag = false;
}
}
}//while
fclose(fp);
/*if(flag==false){
char reply[]={"服务器:我听不懂您的意思。"};
puts(reply);
int lens;
lens = strlen(reply);
send(new_s,reply,lens,0);
}
else{*/
printf("服务器:");
puts(b);
printf("\n");
char * ans=b;
int lens;
lens = strlen(ans);
send(new_s,ans,lens,0);
}
}
closesocket(new_s); //关闭连接
//}
WSACleanup();
return 0;
}
使用strstr的字符串必须以 '\0' 结尾。不然就越界了。你这里很明显不会以 '\0' 结尾
修改了向buf和读取到的line末尾都加了,但还是出现这个问题。