sendto函数:表头文件 #include < sys/types.h > #include < sys/socket.h >定义函数 int sendto ( socket s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;函数说明 sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr的结构长度。返回值 成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。
recvfrom 函数原型: int recvfrom(int socket, void *buffer, size tsize, int flags, struct sockaddr *addr, socklen t *length-ptr) 这个void *buffer是进程用户空间地址,可以是栈上的地址,也可以是你用malloc创建的堆地址。struct sockaddr *addr, socklen t *length-ptr 分别用来存储对端的地址信息和长度, 注意这个长度用的是指针表示,别弄错了。
服务端:#include <stdio.h> #include <sys/select.h>
#include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include<errno.h> #define MAX_MSG_SIZE 1024
int main() { int ser_sockfd,cli_sockfd; /*sock_fd:监听socket;client_fd:数据传输socket */ struct sockaddr_in ser_addr; /* 本机地址信息 */ struct sockaddr_in cli_addr; /* 客户端地址信息 */ char msg[MAX_MSG_SIZE];/* 缓冲区*/ memset(&cli_addr, 0,sizeof(cli_addr)); socklen_t len = sizeof(cli_addr); ser_sockfd=socket(AF_INET,SOCK_DGRAM,0);/*创建连接的SOCKET */ if(ser_sockfd<0) {/*创建失败 */ fprintf(stderr,"socker Error:%s\n",strerror(errno)); return 0; } /* 初始化服务器地址*/ int addrlen=sizeof(struct sockaddr_in); bzero(&ser_addr,addrlen); ser_addr.sin_family=AF_INET; ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); ser_addr.sin_port=htons(8888); if(bind(ser_sockfd,(struct sockaddr*)&ser_addr,sizeof(struct sockaddr_in))<0) { /*绑定失败 */ fprintf(stderr,"Bind Error:%s\n",(char *)strerror(errno)); return 0; } printf("enter while\n"); while(1) {/* 等待接收客户连接请求*/ //int length = recvfrom(ser_sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&cli_addr, sizeof(struct sockaddr_in)); //错误sizeof(struct sockaddr_in)下发要是地址 int length = recvfrom(ser_sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&cli_addr, &len); /* 接受数据*/ // printf("received a connection from ip=%s,port=%d\n", inet_ntoa(cli_addr.sin_addr.s_addr),ntohs(cli_addr.sin_port)); printf("length=%d\n",length); // printf("recvfrom Error:%d\n",errno); if(length > 0){ printf("%s\n",msg);/*在屏幕上打印出来 */ strcpy(msg,"hi,I am server!"); sendto(ser_sockfd,msg,strlen(msg),0,(struct sockaddr*)&cli_addr, sizeof(cli_addr)); /*发送的数据*/ }
} close(ser_sockfd); } 客户端: #include <stdio.h> #include <sys/select.h>
#include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h>
int main(int argc, char* argv[]) { int addrlen=sizeof(struct sockaddr_in); int sclient = socket(AF_INET, SOCK_DGRAM, 0); int i = 10; if(sclient < 0) { printf("invalid socket !"); return 0; } struct sockaddr_in serAddr,cAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(8888); serAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); memset(&cAddr, 0,sizeof(cAddr)); socklen_t len = sizeof(cAddr); char * sendData = " hello tcp server i am client\n"; while(i > 0){ int length = sendto(sclient, sendData, strlen(sendData),0, (struct sockaddr*)&serAddr, sizeof(serAddr)); printf("sendto data length=%d\r\n",length); char recData[255]; int ret = recvfrom(sclient, recData, 255,0, (struct sockaddr*)&cAddr, &len); if(ret > 0) { recData[ret] = 0x00; printf("recData=%s\r\n",recData); } sleep(1); i--; }
close(sclient);
return 0; }
|