您的位置:首页 > 其它

基于UDP简单聊天程序

2011-02-27 12:35 597 查看
/*server.c*/

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888
#define MAX_MSG_SIZE 1024

void udps_respon(int sockfd)
{
int addrlen,n;
struct sockaddr_in client;
char msg[MAX_MSG_SIZE];
char buffer[MAX_MSG_SIZE];
int len;
len=sizeof(struct sockaddr_in);
while(1)
{ /* 浠庣綉缁滀笂璇?骞跺啓鍒扮綉缁滀笂 */
bzero(msg,sizeof(msg)); // 鍒濆鍖?娓呴浂

addrlen = sizeof(struct sockaddr);
printf("h1_1/n");
n=recvfrom(sockfd,msg,sizeof(msg),0,(struct sockaddr *)&client,&addrlen); // 浠庡鎴风鎺ユ敹娑堟伅
msg
='/0';
printf("h1_2/n");
/* 鏄剧ず鏈嶅姟绔凡缁忔敹鍒颁簡淇℃伅 */
fprintf(stdout,"Server have received %s",msg); // 鏄剧ず娑堟伅

/* 浠庨敭鐩樿鍏?鍐欏埌鏈嶅姟绔?*/

bzero(buffer,MAX_MSG_SIZE);
printf("Please input char:");
fgets(buffer,sizeof(buffer),stdin);
sendto(sockfd,buffer,sizeof(buffer),0,(struct sockaddr *)&client,len);
}
}

int main()
{
int sockfd;
struct sockaddr_in addr;

/* 鏈嶅姟鍣ㄧ寮€濮嬪缓绔媠ocket鎻忚堪绗?*/
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
fprintf(stderr,"Socket Error:%s/n",strerror(errno));
exit(1);
}

/* 鏈嶅姟鍣ㄧ濉厖 sockaddr缁撴瀯 */
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(SERVER_PORT);

/* 鎹嗙粦sockfd鎻忚堪绗?*/
if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
{
fprintf(stderr,"Bind Error:%s/n",strerror(errno));
exit(1);
}

udps_respon(sockfd); // 杩涜璇诲啓鎿嶄綔
close(sockfd);
}

/*client*/

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888
#define MAX_BUF_SIZE 1024

void udpc_requ(int sockfd1, struct sockaddr_in addr1,int len)
{
char buffer[10240];
char msg[1024];
int addrlen;
int n;
int nd;
while(1)
{ /* 浠庨敭鐩樿鍏?鍐欏埌鏈嶅姟绔?*/
bzero(buffer,MAX_BUF_SIZE);
printf("Please input char:");
scanf("%s",buffer);
nd=sendto(sockfd1,buffer,sizeof(buffer),0,(struct sockaddr *)&addr1,len);
printf("h2=%d/n",nd);

bzero(msg,sizeof(msg)); // 鍒濆鍖?娓呴浂
addrlen = sizeof(struct sockaddr);
n=recvfrom(sockfd1,msg,MAX_BUF_SIZE,0,(struct sockaddr *)&addr1,&addrlen); // 浠庡鎴风鎺ユ敹娑堟伅
//msg
='/0';
fprintf(stdout,"CLIENT have received %s",msg); // 鏄剧ず娑堟伅
}
}

int main(int argc,char **argv)
{
int sockfd;
struct sockaddr_in addr;

if(argc!=2)
{
fprintf(stderr,"Usage:%s server_ip/n",argv[0]);
exit(1);
}

/* 寤虹珛 sockfd鎻忚堪绗?*/
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
fprintf(stderr,"Socket Error:%s/n",strerror(errno));
exit(1);
}
/* 濉厖鏈嶅姟绔殑璧勬枡 */
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(SERVER_PORT);
if(inet_aton(argv[1],&addr.sin_addr)<0) /*inet_aton鍑芥暟鐢ㄤ簬鎶婂瓧绗︿覆鍨嬬殑IP鍦板潃杞寲鎴愮綉缁?杩涘埗鏁板瓧*/
{
fprintf(stderr,"Ip error:%s/n",strerror(errno));
exit(1);
}

udpc_requ(sockfd,addr,sizeof(struct sockaddr_in)); // 杩涜璇诲啓鎿嶄綔
close(sockfd);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: