socket.h中有一个宏“SO_STATE”,它似乎不存在于solaris 10中。
考虑以下计划:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <assert.h>
/*
* This function reports the error and
* exits back to the shell:
*/
static void
displayError(const char *on_what) {
if ( errno != 0 ) {
fputs(strerror(errno),stderr);
fputs(": ",stderr);
}
fputs(on_what,stderr);
fputc('\n',stderr);
exit(1);
}
int main(int argc,char **argv) {
int z;
int s = -1; /* Socket */
int sndbuf=0; /* Send buffer size */
int rcvbuf=0; /* Receive buffer size */
socklen_t optlen; /* Option length */
/*
* Create a TDP/IP socket to use:
*/
s = socket(PF_INET,SOCK_STREAM,0);
if ( s == -1 ) {
displayError("socket(2)");
}
/*
* Get socket option SO_SNDBUF:
*/
optlen = sizeof sndbuf;
z = getsockopt(s,
SOL_SOCKET,
SO_STATE,
&sndbuf,&optlen);
if ( z ) {
displayError("getsockopt(s,SOL_SOCKET,"
"SO_SNDBUF)");
}
assert(optlen == sizeof sndbuf);
/*
* Get socket option SO_SNDBUF:
*/
optlen = sizeof rcvbuf;
z = getsockopt(s,
SOL_SOCKET,
SO_RCVBUF,
&rcvbuf,&optlen);
if ( z ) {
displayError("getsockopt(s,SOL_SOCKET,"
"SO_RCVBUF)");
}
assert(optlen == sizeof rcvbuf);
/*
* Report the buffer sizes:
*/
printf( "Socket s : %d\n",s);
printf( "Send buf: %d bytes\n", sndbuf);
printf( "Recv buf: %d bytes\n", rcvbuf);
close(s);
return 0;
}
当我在solaris 10中编译它时,我收到以下错误:
sock.c:在函数'main'中:sock.c:47:错误:'SO_STATE'未声明 (首次使用此函数)sock.c:47:错误:(每个未声明 标识符仅报告一次sock.c:47:错误:对于每个函数 它出现在。)
当我在solaris 8中编译它时,它的编译成功。
solaris 10有什么不同?
SOISTATE出现在solaris 8中的socket.h中,然后为什么在solaris 10中将其删除?以下是来自solaris 8。
cat /usr/include/sys/socket.h |grep SO_STATE
#define SO_STATE 0x2000 /* Internal: get so_state */
虽然solaris 10中的socket.h中没有SO_STATE。