又是我 小问题集锦 纯新手 相当简单
纯菜鸟问题u8 buf
struct linger linger = { 0 };
linger.l_onoff = 0;
linger.l_linger = 0;
status = setsockopt(listenfd,SOL_SOCKET, SO_LINGER,(const char *) &linger,sizeof(linger));
if (-1 == status)
{
perror("setsockopt(...,SO_LINGER,...)");
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(AUTH_PORT);
bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
listen(listenfd, 5);
for ( ; ; ) {
int connfd;
clilen = sizeof(cliaddr);
printf("87 ok! listenfd is %d \n",listenfd);
connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
//slaveSocket = accept(serverSocket,(struct sockaddr *) &clientName, &clientLength);
buf_len = 0;
while(0<(rc=read(connfd, &buf, NET_FRAME_LENGTH)))//NET_FRAME_LENGTH = 14
{
buf_len += rc;
if (NET_FRAME_LENGTH == buf_len)
{
break;
}
}
if (buf_len < NET_FRAME_LENGTH)
{
close(connfd);
continue;
}
write(connfd, buf, NET_FRAME_LENGTH);
close(connfd);
}
1、(const char *) &lingerlinger是个stuct的对象它变成(const char *)的结果是什么呢 难道是0,0?已开始的赋值{0} 是什么意思
2、 accept和getpeername的第二个参数都是cliaddr为什么指针类型不一样
3、 为什么accept的时候不填充cliaddr吗?非要getpeername在填充一次才能获取cliaddr的值?
4、read(connfd, &buf, NET_FRAME_LENGTH) 第二个参数为什么不直接写&buf 为什么要写成&buf还有为什么buf的类型是u8而不是u什么char
5、最后一个问题for ( ; ; )是不是死循环?如果是为什么不用while(1)? 1. (const char*)&linger 是说取linger这个结构体的地址, 由于现在这个地址是(struct linger*)类型, 而(const char*)就是将这个类型转换成(const char*)类型. 而其值是不变的. 只是类型变了. 而类型变了会造成什么样的影响你可以参考<C专家编程> 这本书.
2. 函数的参数都有其类型, 只是说将这个值转换成了某个类型而已. 其值是不会变的. 这个不一样一般是为了消除警告.
3. accept的时候要填充cliaddr的值.
4. &buf 是取一个地址, 相当于是buf+buf_len的值. 因为u8是指定了8位的, 你一个char有可能不是8位呢, 虽然大多数情况下都是这样的, 但是为了移植性, 采用u8.
5. 是死循环. 个人爱好而已. 没什么特别的! 精辟。。。:lol: :lol: 我现在集中回复我以前发的SB帖子,我错了,我n年前太菜了,让大家见笑了
问题的集锦好象很容易吸引人,因为总会有个问题你会懂
页:
[1]