C语言SOCKET编程问题,请老鸟指点
交谈中请勿轻信汇款、中奖信息,勿轻易拨打陌生电话。No.万 Troyan<visualbsc@ 20:12:31
/**TCP服务端 */
#include<stdio.h>
#include<stdlib.h>
#include<Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
int main(void){
SOCKET sListen,sAcpt; //记录监听、连接套接字
int sendLen; //记录返回的发送的字节数
int cliLen; //记录客户端协议地址的长度,用来作为生成连接套接字accept的参数
sockaddr_in serAddr,cliAddr; //服务端,客户端的协议地址
WSAData wsaData; //定义版本结构体
char buf[]="hello!i'm a server!"; //服务端需要发送的数据
int port=5000; //服务器的端口
printf("---waiting-------\n");
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("WSAStartup() failed,code: %d\n",WSAGetLastError());
return 1;
}
if(MAKEWORD(2,2)!=wsaData.wVersion) //套接字版本不一样
{
WSACleanup(); //释放
return 1;
}
sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建监听套接字
serAddr.sin_family=AF_INET; //定义协议类型为IP
serAddr.sin_port=htons(port); //将主机顺序的端口字节转换为网络顺序的字节
serAddr.sin_addr.s_addr=htonl(INADDR_ANY);//由服务器分配地址
if(bind(sListen,(SOCKADDR *)&serAddr,sizeof(serAddr))==SOCKET_ERROR)
{
printf("bind() failed code:%d",WSAGetLastError());
return 1;
}
if(listen(sListen,5)==SOCKET_ERROR)
{
printf("listen() failed code:%d\n",WSAGetLastError());
return 1;
}
cliLen=sizeof(cliAddr);
while(1)
{
sAcpt=accept(sListen,(SOCKADDR *)&cliAddr,&cliLen); //创建连接套接字
if(sAcpt==INVALID_SOCKET)
{
printf("accept() failed code: %d",WSAGetLastError());
return 1;
}
//输出客户端的网络地址
printf("client port:[%d]\t ip:[%s]",ntohs(cliAddr.sin_port),inet_ntoa/*点分十进制的IP转换成网络字节顺序的地址*/(cliAddr.sin_addr));
sendLen=send(sAcpt,buf,sizeof(buf),0); //发送信息并且返回一个值
if(sendLen==SOCKET_ERROR)
{
printf("send() failed code:%d\n",WSAGetLastError());
break;
}
else if(sendLen==0)
break;
else
{
printf("send massage length is %d\n",sendLen);
printf("------------------\n");
}
closesocket(sAcpt);
}
closesocket(sListen); //关闭连接
WSACleanup(); //释放资源
return 0;
}
-------------------------------------------------------------
/*TCP 客户端*/
#include<Winsock2.h>
#include<stdio.h>
#pragma comment(lib, "ws2_32.lib")
#define BUFFSIZE 1024
#define DEFAULT_PORT 5000
int main(){
SOCKET s; //客户端的套接字
WSAData wsaData; //版本结构体
int port=DEFAULT_PORT; //客户端端口号
char buf[BUFFSIZE]; //接受服务器端的缓存区
sockaddr_in serAddr; //客户端服务端的网络地址
int recLen;//接收到服务端发送过来的长度
char saddr[50];
gets(saddr);
if(WSAStartup(0X0202,&wsaData)!=0){
printf("WSAStartup() failed code:%d",WSAGetLastError());
return 1;
}
if(0x0202!=wsaData.wVersion){
WSACleanup();
return 1;
}
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //建立套接字
if(s==INVALID_SOCKET){
printf("socket() failed code: %d",WSAGetLastError());
return 1;
}
memset(buf,0,sizeof(buf)); //接收信息缓冲区初始化为全零
serAddr.sin_family=AF_INET;
serAddr.sin_port=htons(port);
serAddr.sin_addr.s_addr=inet_addr(saddr);
if(connect(s,(SOCKADDR *)&serAddr,sizeof(SOCKADDR))==INVALID_SOCKET){
printf("connnect() failed code: %d",WSAGetLastError());
return 1;
}
else
{
recLen=recv(s,buf,sizeof(buf),0);
if(recLen==SOCKET_ERROR){
printf("recv() error code: %d\n",WSAGetLastError());
return 1;
}
printf("recieve data from server: %s\n",buf);
}
closesocket(s);
WSACleanup();
}
想要实现 一台电脑上测试,用本机内部本地地址 192.168的C类地址 在客户端输入该地址 后 用connect函数申请连接上面的服务端程序
服务端程序listen到后
用accept返回一个连接套接字,并且显示客户端IP bind的端口号码
然后send buf字符串里面的内容发送过去给客户端 显示出来
但是效果不是想要的,希望老鸟指点下,源码里面出了什么问题!
谢谢了!