linux 网络编程 sendto 问题

linux 网络编程 sendto 问题,第1张

sendto(经socket传送数据)

相关函数 send , sendmsg,recv , recvfrom , socket

表头文件 #include <sys/types.h >

#include <sys/socket.h >

定义函数 int sendto ( int 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 中。

错误代码 EBADF 参数s非法的socket处理代码。

EFAULT 参数中有一指针指向无法存取的内存空间。

WNOTSOCK canshu s为一文件描述词,非socket。

EINTR 被信号所中断。

EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。

ENOBUFS 系统的缓冲内存不足。

EINVAL 传给系统调用的参数不正确。

范例 #include <sys/types.h >

#include <sys/socket.h >

# include <netinet.in.h>

#include <arpa.inet.h>

#define PORT 2345 /*使用的port*/

main(){

int sockfd,len

struct sockaddr_in addr

char buffer[256]

/*建立socket*/

if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){

perror (“socket”)

exit(1)

}

/*填写sockaddr_in 结构*/

bzero ( &addr, sizeof(addr) )

addr.sin_family=AF_INET

addr.sin_port=htons(PORT)

addr.sin_addr=hton1(INADDR_ANY)

if (bind(sockfd, &addr, sizeof(addr))<0){

perror(“connect”)

exit(1)

}

while(1){

bezro(buffer,sizeof(buffer))

len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len)

/*显示client端的网络地址*/

printf(“receive from %s\n “ , inet_ntoa( addr.sin_addr))

/*将字串返回给client端*/

sendto(sockfd,buffer,len,0,&addr,addr_len)”

}

}

unsigned int dir(char * server) {

int sck//套接字变量

struct sockaddr_in serv_adr//远程主机的地址

struct hostent *host //指向远程主机的指针

unsigned char databuf[FILEBUF_SIZE]//数据

int bytes = 0, bytesread = 0//字节数,读取到的字节数

host = gethostbyname(server)//根据远程主机的主机名,得到指向远程主机的指针

if (host == (struct hostent *) NULL) { //如果得到指向远程主机的指针失败,报告错误,并返回

perror("gethostbyname failed")

return 0

}memset(&serv_adr, 0, sizeof(serv_adr))//初始化远程主机的地址,结构体内所有成员清零

serv_adr.sin_family = AF_INET //设置地址类型

memcpy(&serv_adr.sin_addr, host->h_addr, host->h_length)//取出指向远程主机的指针中包含的地址信息,赋给远程主机地址变量

serv_adr.sin_port = htons(SERVICE_PORT)//设置端口号,比如http服务对应80端口,ftp对应21端口

if ((sck = socket(AF_INET, SOCK_STREAM, 0)) <0) { //如果建立TCP协议的套接字失败,报告错误,并返回

perror("error on socket()")

return 0

}

if (connect(sck, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) <0) {//如果使用该套接字连接到远程主机失败,报告错误,并返回

perror("error on connect()")

return 0

}write(sck, "DI\n\n", 4)//连接成功,发送内容为"DI\n\n"的消息,远程主机收到该消息,解析后生成目录列表,并将目录列表信息传递回来

printf("Remote directory listing:\n")//输出提示信息“远程主机正在生成目录列表”

while ((bytes = read(sck, databuf, FILEBUF_SIZE)) >0) { //从套接字的数据流中读取远程主机的返回信息(即目录列表),每次读取FILEBUF_SIZE个字节,直到全部读取完毕

write(fileno(stdout), databuf, bytes)//将每次读到的数据,输出到标准输出流(stdout),即屏幕上

bytesread += bytes//接收到的字节数累加

}

close(sck)/* Close the socket */ //通信完成,关闭套接字,关闭连接

return bytesread//返回读取到的字节数(即远程主机返回的信息的大小)

}

你创建的socket是无连接类型的 sockfd = socket(AF_INET,SOCK_DGRAM,0) //创建套接字

这种socket是不能用来listen和accept的,只有 有连接类型的socket才能listen和accept,改成

sockfd = socket(AF_INET,SOCK_STREAM,0) //创建套接字

就行了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7526182.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-06
下一篇2023-04-06

发表评论

登录后才能评论

评论列表(0条)

    保存