• 7980阅读
  • 1回复

【提问】我写的服务器和客户端程序 为什么老是连接不上?? [复制链接]

上一主题 下一主题
离线ratzip
 

只看楼主 倒序阅读 楼主  发表于: 2005-12-22
高手帮帮忙
真的很急
我都要急死啦
就是连接不上

//这是服务器端
#include<stdio.h>
#include<winsock2.h>
#include<string.h>
#include<conio.h>
#pragma comment(lib,"Ws2_32.lib")

SOCKET server;
SOCKET client;
WSADATA WSAData;
int WSAreturn;
sockaddr_in local;
sockaddr_in from;
int fromlen = sizeof(from);
char information[50];
char welcome[]="欢迎您登陆YYJW主机!\n";
char receive[256];
char ip[]="您的IP是:";
char chat[256];
char c;
int i=0;
bool cansend=false;
int GetIp()
{
WSAreturn = WSAStartup(0x101,&WSAData);
if(WSAreturn)
{
printf("发生一个未知错误!\n");
return 0;
}
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons((u_short)23);
server = socket(AF_INET,SOCK_DGRAM,0);
if(server==INVALID_SOCKET )
{
printf("无法创建套接字!\n");
return 0;
}
if(bind(server,(sockaddr *)&local,sizeof(local))!=0)
{
printf("无法绑定套接字!\n");
return 0;
}
//if(listen(server,5)!=0)
//{
//printf("无法监听端口!\n");
//return 0;
//}
while(true)
{
printf("正在等待用户连接...\n");
//client = accept(server,(struct sockaddr *)&from,&fromlen);
strcpy(information,inet_ntoa(from.sin_addr));
strcat(welcome,information);
  printf("接受来自%s的连接...\n",inet_ntoa(from.sin_addr));
printf("正在发送欢迎消息...\n");
send(client,welcome,strlen(welcome),0);
//send(client,ip,strlen(ip),0);
//send(client,information,strlen(information),0);
printf("欢迎消息信息已经成功发送至客户端!\n");
while(1)
{
if(!cansend)
{

printf("正在等待对方发来消息...\n");
cansend=false;
recv(client,receive,sizeof(receive),0);

printf("*********接受到的消息***********\n");
printf("%s\n",receive);

printf("**************结束**************\n");
cansend=true;
}
else
{

printf("请输入下一条消息:");
scanf("%s\0",&chat);
 
send(client,chat,strlen(chat),0);
printf("\n已经成功发送出信息!\n");
cansend=false;
}
}

closesocket(client);


}
closesocket(server);
WSACleanup();
return 1;
}
void main()
{
int ok;

ok = GetIp();
if(ok==0)
printf("无法完成请求!\n");
getch();
}

//这是客户端
#include<stdio.h>
#include<winsock2.h>
#include<string.h>
#include<conio.h>
#pragma comment(lib,"Ws2_32.lib")
SOCKET client;
WSADATA WSAData;
int WSAreturn;
sockaddr_in to;
char information[256];
char welcome[]="我已经登陆到你的主机!\n";
char receive[256];
char chatto[256];
char servername[256];
char chatfrom[256];
char c;
long result;
bool cansend=true;
int connection()
{
WSAreturn = WSAStartup(0x101,&WSAData);
if(WSAreturn)
{
printf("发生一个未知错误!\n");
return 0;
}

client = socket(AF_INET,SOCK_DGRAM,0);
to.sin_family = AF_INET;
to.sin_port = htons(23);

while(true)
{
printf("请输入要登陆的IP:");
scanf("%s",&servername);

to.sin_addr.s_addr = inet_addr(servername);

printf("正在连接...\n");
result = connect(client,(struct sockaddr *)&to,sizeof(to));
if(SOCKET_ERROR==result)
{
// 连接失败
printf("对不起,无法连接到目标主机!\n");
WSACleanup();
return 0;
}

else
{

cansend=false;
recv(client,receive,sizeof(receive),0);
printf("*******欢迎消息消息*******\n");
printf("%s\n",receive);
printf("***********结束*********\n");
cansend=true;
while(1)
{

if(cansend)
{

printf("请输入下一条信息:");
scanf("%s\0",&chatto);

send(client,chatto,strlen(chatto),0);
printf("\n已经成功发送信息!\n");
cansend=false;
}
else
{

printf("正在等待对方发来消息...\n");
cansend=false;
recv(client,chatfrom,sizeof(chatfrom),0);

printf("*******接收到的消息*******\n");
printf("%s\n",chatfrom);
printf("***********结束*********\n");
cansend=true;
}


}

}


}
closesocket(client);
WSACleanup();
return 1;
}
void main()
{
connection();
getch();
}
BLOG: http://www.juntuan.cn/user1/999/index.shtml
离线renstone

只看该作者 1楼 发表于: 2006-01-01
server = socket(AF_INET,SOCK_DGRAM,0);

这一句说明你是用的是udp协议,udp是一个无连接的协议.

所以在绑定后,不需要listen.一般都是采用下面的结构
udp服务器的流程:
  1. struct sockaddr_in clientAddr;
  2. int lengthOfClient = sizeof(struct sockaddr_in);
  3. int noOfBytes;
  4. char message[MAX_LENGTH];
  5. while (1)
  6. {
  7.   int length = lengthOfClient;
  8.   int lengthOfMessage = 0;
  9.   noOfBytes = recvfrom(socketFD, message, MAX_LENGTH, 0, &clientAddr, &length);
  10.   //使用recvfrom阻塞等待,直至有客户发数据,当返回时, clientAddr会被填充为发送方的地址,数
  11.   //据则被存储于message缓冲区,noOfBytes为接收的字节数
  12.   ..... //准备好要返回的信息
  13.   sendto(socketFD, message, lengthOfMessage, 0, &clientAddr, length);
  14. }



客户端的代码也是一样.记住udp是一个无连接的协议
所以你的connect那一句根本就是错的.

udp客户一般的流程是
  1. socketFd = socket(...);
  2. struct sockaddr_in serverAddr;
  3. memcpy(&server, 0, sizeof(struct sockaddr_in));
  4. ..准备目标地址.
  5. char message[MESSAGE_LENGTH];
  6. while (1)
  7. {
  8.   ..发送数据准备
  9.   sendto(socketFD, message, strlen(message), 0, &serverAddr, length);
  10.   recvfrom(socketFD, message, MESSAGE_LENGTH, 0, NULL, NULL); //阻塞等待直到服务器防返回消息
  11. ...数据处理
  12.  
  13. }

建议读一下unix网络编程第一卷.或者看使用tcp/ip进行网际互联第3卷的windows版.一些基本概念还是有必要搞清楚的.
[ 此贴被renstone在2006-01-01 03:48重新编辑 ]
快速回复
限100 字节
 
上一个 下一个