服务器端:
/*
面向连接的socket客户端通过 调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用 bind函数来配置本地信息。
*/
#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)
{
struct sockaddr_in addr;
int addrlen,n;
char msg[MAX_MSG_SIZE];
while(1)
{
/*从网络上读,并写到网络上*/
memset(msg,0,sizeof(msg));//初始化,清零
addrlen=sizeof(struct sockaddr);
n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&addr,&addrlen);//从客户端接收消息
msg[n]='\0';//将接收的字符串加上字符串结束标志
/*显示服务器已经收到的信息*/
fprintf(stdout,"Server received %s \n",msg);
}
}
int main()
{
int sockfd;
struct sockaddr_in addr;
/*服务器端开始建立socket描述符*/
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
fprintf(stderr,"socket error :%s \n",strerror(errno));
exit(1);
}
/*服务器端填充sockaddr结构*/
memset(&addr,0,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);
}
/*
#include<sys/types.h>
#include<sys/socket.h>
int PASCAL FAR recv( SOCKET s, char FAR* buf, int len, int flags);
s:一个标识已连接套接口的描述字。
buf:用于接收数据的缓冲区。
len:缓冲区长度。
flags:指定调用方式。
*/
/*
函数原型:ssize_t recvfrom(int s,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen); ssize_t 相当于 int,socket_t 相当于int ,这里用这个名字为的是提高代码的自说明性。
参数:
s:标识一个已连接套接口的描述字。
buf:接收数据缓冲区。
len:缓冲区长度。
flags:调用操作方式。
from:(可选)指针,指向装有源地址的缓冲区。
fromlen:(可选)指针,指向from缓冲区长度值。
返回值:
如果正确接收返回接收到的字节数,失败返回0.
*/
/*
qust@qust-K42JZ:~/test$ ./udp_server
break point :ddd
Server received ddd
break point :dddd
Server received dddd
^Z
[1]+ 已停止 ./udp_server
qust@qust-K42JZ:~/test$ bg
[1]+ ./udp_server &
qust@qust-K42JZ:~/test$ fg
./udp_server
jobs 显示当前暂停的进程
bg fg 默认后台,前台 最后一个进程
bg %1
fg %1
*/
客户端:
#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 sockfd,const struct sockaddr_in *addr,int len)
{
char buffer[MAX_BUF_SIZE];
int n;
while(1)
{
/*从键盘读入,写到服务器*/
printf("Please input text: \n");
fgets(buffer,MAX_BUF_SIZE,stdin);
sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)addr,len);
memset(buffer,0,MAX_BUF_SIZE);
}
}
int main(int argc,char **argv)
{
int sockfd;
struct sockaddr_in addr;
if(argc!=2)
{
fprintf(stderr,"NO %s server_ip\n",argv[0]);
exit(1);
}
/*建立sockfd描述符*/
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
fprintf(stderr,"Socket error :%s",strerror(errno));
exit(1);
}
/*填充服务器端*/
memset(&addr,0,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转化为网络2进制数字
{
fprintf(stderr,"IP error:%s \n",strerror(errno));
exit(1);
}
/*进行读写*/
udpc_requ(sockfd,&addr,sizeof(struct sockaddr_in));
close(sockfd);
}