首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

两个终端的socket通信有关问题

2013-01-28 
两个终端的socket通信问题客户端代码及ip:192.168.0.112#include WinSock2.h#include stdio.hSOCKADDR

两个终端的socket通信问题
客户端代码及ip:192.168.0.112

#include <WinSock2.h>
#include <stdio.h>

SOCKADDR_IN addrSrv;
SOCKET sockSvr;
SOCKADDR_IN sockCli;

enum
{
FILE_ERROR = -1,//文件打开失败返回
FILE_SUCCEED,//文件打开成功返回
};

//绑定ip地址和端口号
int InitCliSocket(char *ipAdress, int port)
{
WORD wVersionRequested;
WSADATA wsaData;
int nRes = 0;
int nErrCode = 0;
int bExit = 0;

wVersionRequested = MAKEWORD(1, 1);

nRes = WSAStartup(wVersionRequested, &wsaData);
if (0 != nRes)
{
printf("err code:%d", WSAGetLastError());
return 0;
}

if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
printf("VERSION DIFF");
WSACleanup();
return 0;
}

sockSvr = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sockSvr)
{
printf("err code:%d", WSAGetLastError());
return 0;
}

//绑定IP地址,端口号
 addrSrv.sin_family = AF_INET;
 addrSrv.sin_addr.S_un.S_addr = inet_addr(ipAdress);
 addrSrv.sin_port = htons(port);

nRes = bind(sockSvr, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (SOCKET_ERROR == nRes)
{
printf("err code:%d", WSAGetLastError());
return 0;
}

return 1;
}

int sendmsg(char *buf)
{
//SOCKADDR_IN sockCli;
int nLen = sizeof(SOCKADDR_IN);

sendto(sockSvr, buf, strlen(buf), 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

memset(buf, 0, strlen(buf));

recvfrom(sockSvr, buf, 1024, 0, (SOCKADDR*)&sockCli, &nLen);

return 0;
}

int main()
{
char *fname = "e:\\main.c";

FILE *fp = NULL;
FILE *fp1 = NULL;

char str[1024] = {0};

int nRes;

//打开需要读出的文件失败
if ((fp = fopen(fname,"r")) == NULL)
{
printf("can not open the file!");
return FILE_ERROR;
}

nRes = InitCliSocket("192.168.0.103", 6000);
if (nRes == 0)
{
printf("连接失败!");
return 0;
}

printf("开始发送数据!");

//读取一行数据
while ((fgets(str, 1000, fp)) != NULL)    
{
printf("!!!!");
sendmsg(str);
}

printf("数据发送完毕!");

//关闭socket
closesocket(sockSvr);
//文件读取完毕,关闭文件
fclose(fp);
fp = NULL;

system("pause");

return 1;
}


服务端代码及ip:192.168.0.138
#include <WinSock2.h>
#include <stdio.h>
#include <string.h>

int initsocket()
{
WORD wVersionRequested;
WSADATA wsaData;
int nRes = 0;
SOCKET sockSvr;
int nErrCode = 0;
int bExit = 0;
SOCKADDR_IN addrSrv;

char *fname = "e:\\d.txt";
FILE *fp = NULL;

wVersionRequested = MAKEWORD(1, 1);

nRes = WSAStartup(wVersionRequested, &wsaData);


if (0 != nRes)
{
printf("err code:%d\n", WSAGetLastError());
return 0;
}

if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
printf("VERSION DIFF");
WSACleanup();
return 0;
}

sockSvr = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sockSvr)
{
printf("err code:%d", WSAGetLastError());
return 0;
}

addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.101");
addrSrv.sin_port = htons(6000);

nRes = bind(sockSvr, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (SOCKET_ERROR == nRes)
{
printf("err code:%d", WSAGetLastError());
printf("4");
return 0;
}

printf("连接成功!");

while (!bExit)
{
SOCKADDR_IN sockCli;
char buf[1024] = {0};
int nLen = sizeof(SOCKADDR_IN);
int nRes;
int res = 0;

res = recvfrom(sockSvr, buf, 1024, 0, (SOCKADDR*)&sockCli, &nLen);
if (0 == res)
{
printf("err code:%d", WSAGetLastError());
return 0;
}

if ((fp = fopen(fname, "a+")) == NULL)
{
printf("can not open the file!");
return 0;
}

//写入到文件
nRes = fwrite(buf, 1, strlen(buf), fp);

if (nRes != 0)
{
printf(buf);
}

fclose(fp);
fp = NULL;

sendto(sockSvr, buf, strlen(buf)+1, 0, (SOCKADDR*)&sockCli, sizeof(SOCKADDR));
}

closesocket(sockSvr);
return 0;
}


int main()
{
initsocket();
system("pause");
return 1;
}




现在我要进行的是客户端像服务端发送一个文件,即main.c这个,我的想法是将文件一行一行读取之后通过socket发送到服务端,服务端接收之后在写入文件,我在本机上建立了两个解决方案,服务端和客户端的ip都设定为127.0.0.1这样是可以的,但是如果把服务端的绑定的ip改成客户端的,把客户端绑定的ip改成服务端的,这样子不能通信,错误代码为10049,在其上下文中,该请求的地址无效。 不知道怎么回事,各位帮帮忙啊,我用的是vs2005,我是把release文件夹给服务端了,本机充当客户端
[解决办法]
服务端绑定的ip是服务器自己的ip,客户端绑定的ip也是服务器的ip,两个是一样的
[解决办法]
udp协议
服务端
绑定本机ip和固定端口

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(SERVER_PORT);

bind(sockfd,(struct sockaddr *)&addr,...

客户端
无需绑定ip和端口,
直接向服务器的ip和端口发送数据即可。
sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr *)addr,len);
addr中指定服务器的ip和端口

热点排行