网络第一课(6)--setsockopt

来源:互联网 发布:淘宝重复铺货怎么举报 编辑:程序博客网 时间:2024/04/29 07:55


getsockopt,  setsockopt  - get and set options on sockets

 int setsockopt(int sockfd, int level, int optname,
                      const void *optval, socklen_t optlen)


大笑我们通过setsockopt来制做我们自已的简单udp协议头,下面的ip/mac层还有由os 帮我们做。


#include <stdio.h>

#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <linux/udp.h>
#include <linux/ip.h>
//client
int main()
{
int ret=0,fd;
fd = socket(AF_INET,SOCK_RAW,IPPROTO_UDP);//创建一个原始,套接口。
if(fd<0)
{
perror("socket");
return 1;

}


struct sockaddr_in recv;//填写对方的信息。

recv.sin_family = AF_INET;
recv.sin_port = htons(9527);//对方接收端口。
recv.sin_addr.s_addr = inet_addr("192.168.0.33");//对方的ip
int value = 0;//value = 0时,我们设置传输层与应用层;
//value = 1时,我们设置网络层,传输层,应用层。
int len = 4;//value len = 4字节
ret = setsockopt(fd,IPPROTO_IP,IP_HDRINCL,&value,len);//下面开始制做我们的ip头。
if(ret < 0)
{
perror("set sock option");
return 1;

}


char *p = "cc is gays";//udp上层(应用层的数居)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


微笑这里开始制做我们的udp头部。

unsigned char buff[1024]={0};

struct udphdr *udp =(struct udphdr *)buff;

udp->source = htons(999);

udp->dest = htons(9527);

udp->len = htons(8+10);//*p字符串长十个字节 

udp->check = htons(0);

________________________________________________________________strcpy(buff+8,p);//将所有的数据拷贝到buff里面。

ret= sendto(fd,buff,18,0,(struct sockaddr*)&recv,16);

if(ret < 0){

perror("sendto");

return 1;

}

close(fd);

return 0;

}

++++++++++++++++++++++++++++++++++++++++++++++++

下面是接收方。

/server_UDP
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd < 0)
{
perror("socket");
return 1;
}
char buff[1024]={0};
//接收方自己的信息。
struct sockaddr_in recv;
recv.sin_family = AF_INET;
recv.sin_port = htons(9527);
recv.sin_addr.s_addr = htonl(INADDR_ANY);

int ret = bind(fd,(struct sockaddr *)&recv,16);//监听这个端口。
if(ret < 0)
{
perror("bind");
return 1;
}

struct sockaddr_in from;//用来填充发信人的信息
int len = 0;//这个结构体的大小。
ret = recvfrom(fd,buff,1024,0,(struct sockaddr *)&from,&len);
if(ret < 0)
{
perror("recvform");
return 1;
}
printf("%s\n",buff);
return 0;
}



原创粉丝点击