2
回答
VC6 如何将在unix下实现的数据包套接字的对等模式编程改为在window下实现,如何实现?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
1、Windows环境,以VC6.0为开发工具,采用无连接套接字编程的对等模式实现下面的聊天程序。
2、Windows环境,以VC6.0为开发工具,采用无连接套接字编程的C/S模式实现下面的聊天程序。

在unix下的代码如下:


#include<sys/types.h>
#include<unistd.h>
#include<error.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>

/*中断处理过程*/
void int_proc(int signo) {}
void main(int argc,char ** argv)
{
struct sockaddr_in daddr,saddr,cmpaddr;
int sockfd;
char buffer[1024];
int addrlen,n;
   
/*判断用户输入的命令行是否正确,如果有错,提示用法*/
if(argc!=5)
{
printf("用法:%s 目的IP 目的端口 源IP 源端口\n",argv[0]);
exit(0);
}

/*设定中断处理函数,并设置时间限制*/
signal(SIGALRM,int_proc)
alarm(timer);

/*建立数据报套接字*/
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(socket<0){
fprintf(stderr,"socket error!\n");
exit(1);
}
/*为结构变量daddr的各个字段赋值*/
addrlen=sizeof(struct sockaddr_in);
memset(&daddr,0,addrlen);
daddr.sin_family=AF_INET;
daddr.sin_port=htons(atoi(argv[2]));
if(inet_pton(AF_INET,argv[1],&daddr.sin_addr)<=0){
fprintf(stderr,"Invaild dest IP!\n");
exit(0);
}
/*为结构变量saddr的各个字段赋值*/
addrlen=sizeof(struct sockaddr_in);
memset(&saddr,0,addrlen);
  saddr.sin_family=AF_INET;
saddr.sin_port=htons(atoi(argv[4]));
if(inet_pton(AF_INET,argv[3],&saddr.sin_addr)<=0){
fprintf(stderr,"Invaild source IP!\n");
exit(0);
}

/*绑定地址*/
if(bind(sockfd,&saddr,addrlen)<0){
fprintf(stderr,"bind local addr error!\n");
exit(1);
}

/*从标准输入过的字符串,并发送给目标地址*/
if(fgets(buffer,1024,stdin)==NULL) exit(0);
if(sendto(sockfd,buffer,strlen(buffer),0,&daddr,addrlen)){
fprintf(stderr,"sendto error!\n");
exit(2);
}

while(1){
/*接收信息并显示*/
n=recvfrom(scokfd,buffer,1024,0,&cmpaddr,&daddrlen);
if(n<0){
/*根据errno中的数值是否为常量EWOULDBLOCK,来区别超时错和一般性错*/
if(error==EWOULDBLOCK)
fprintf(stderr,"recvfrom timeout error!\n");
else{
fprintf(stderr,"recvfrom error!\n");
exit(3);
};
}else{
/*比较数据报来源地址与保存的目标地址是否一致*/
/*不同则返回非0,结束此循环*/
if(memcp(cmpaddr,daddr,addrlen)) continue;
buffer[n]=0;
  printf("Received:%s",buffer);
}

/*从标准输入获得字符串,并发送给目标地址*/
if(fgets(buffer,1024,stdin)==NULL) exit(0);
if(sendto(sockfd,buffer,strlen(buffer),&daddr,addrlen)){
fprintf(stderr,"sendto error!\n");
exit(3);
}
}
/*关闭套接字*/
close(sockfd);

举报
fhan523
发帖于6年前 2回/360阅
顶部