#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <net/if.h>
#include <sys/select.h>
#define SERVER_PORT 8888
#define MAX_STR_SIZE 1024
void sendchat()
{
int send_fd;
struct sockaddr_in serv_addr;
char serverip[INET_ADDRSTRLEN];
int read_bytes;
socklen_t serv_addrlen;
char send_str[MAX_STR_SIZE];
char recv_str[MAX_STR_SIZE];
bzero(send_str,MAX_STR_SIZE);
bzero(recv_str,MAX_STR_SIZE);
send_fd=socket(AF_INET,SOCK_DGRAM,0);//udp协议
bzero(&serv_addr,sizeof(struct sockaddr_in)); //初始化清零
serv_addr.sin_family=AF_INET; //ipv4
serv_addr.sin_port=htons(SERVER_PORT);//htons为host to network short,转换为网络模式
printf("请输入对方ip地址: ");
gets(serverip);
bzero(serverip,INET_ADDRSTRLEN);
gets(serverip);
if(inet_aton(serverip,&serv_addr.sin_addr)<0)
{ //将字符串格式ip地址转换为网络格式的ip地址
fprintf(stderr,"Ip error:%s\n",strerror(errno));
exit(1);
}
serv_addrlen= sizeof(struct sockaddr);
while(1){
printf("client: ");
fgets(send_str,MAX_STR_SIZE,stdin);
if(send_str[0]=='\n'){//fgets会将‘\n’也读取,在main函数中选择功能时按enter,会使fgets只获取一个‘\n’
bzero(send_str,MAX_STR_SIZE);
fgets(send_str,MAX_STR_SIZE,stdin);
}
sendto(send_fd,send_str,strlen(send_str),0,(struct sockaddr *)&serv_addr,serv_addrlen);
bzero(send_str,MAX_STR_SIZE);
sendto(send_fd,send_str,strlen(send_str),0,(struct sockaddr *)&serv_addr,serv_addrlen);
bzero(send_str,MAX_STR_SIZE);
}
}
void recvchat()
{
int recv_fd;
struct sockaddr_in serv_addr,cli_addr;
int read_bytes;
socklen_t cli_addrlen;
char recv_str[MAX_STR_SIZE];
char send_str[MAX_STR_SIZE];
bzero(recv_str,MAX_STR_SIZE);
bzero(send_str,MAX_STR_SIZE);
recv_fd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(SERVER_PORT);
if(bind(recv_fd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))<0)
{
fprintf(stderr,"Bind Error:%s\n",strerror(errno));
exit(1);
}
cli_addrlen = sizeof(struct sockaddr);
while(1){
read_bytes=recvfrom(recv_fd,recv_str,MAX_STR_SIZE,0,(struct sockaddr*)&cli_addr,&cli_addrlen);//获取对方ip地址
recv_str[read_bytes]='\0';
printf("client: %s",recv_str);
bzero(recv_str,MAX_STR_SIZE);
printf("server: ");
fgets(send_str,MAX_STR_SIZE,stdin);
if(send_str[0]=='\n'){
bzero(send_str,MAX_STR_SIZE);
fgets(send_str,MAX_STR_SIZE,stdin);
}
sendto(recv_fd,send_str,strlen(send_str),0,(struct sockaddr *)&cli_addr,cli_addrlen);
bzero(send_str,MAX_STR_SIZE);
}
}
int main(int argc, char *argv[])
{
int i;
printf("\t1.发起聊天\t2.等待接受聊天\n");
scanf("%d",&i);
if(i==1)
sendchat();
else
recvchat();
return 0;
}
linux基本的聊天软件代码实现
最新推荐文章于 2021-05-13 20:47:50 发布