|
[root@BillingServer test]# gcc -o tcpsock tcpsock.c
In file included from tcpsock.c:4:
tcpsock.h:17:28: sys/netinet/in.h: 没有那个文件或目录
tcpsock.h:18:29: sys/netinet/tcp.h: 没有那个文件或目录
tcpsock.c: In function `CreateConnection':
tcpsock.c:130: incompatible types in assignment
tcpsock.c: In function `AcceptConnection':
tcpsock.c:142: warning: passing arg 2 of `accept' from incompatible pointer type
tcpsock.c:162: incompatible types in assignment
tcpsock.c: In function `QuerySocketsMsg':
tcpsock.c:209: invalid operands to binary /
tcpsock.c:215: invalid operands to binary /
tcpsock.c:224: invalid operands to binary /
tcpsock.c:256:2: warning: no newline at end of file
这个文件原来是sco unix里头的,是不是和linux里的头文件有区别,要屏蔽一些头文件?
tcpsock.c文件如下:
- /* File Name: tcpsock.c */
- /* 本文件给出九个函数的源代码,其中部分地方给出中文注释 */
- #include "tcpsock.h"
- int InitSocketsStruct(char * servicename)
- /* Initialize Sockets structure. If succeed then return 1, else return error code (<0) */
- /* 此函数用于只需要主动套接字的客户程序,它用来获取服务信息.服务的定义在/etc/services文件中 */
- {
- struct servent *servrec;
- struct sockaddr_in serv_addr;
- if ((servrec = getservbyname(servicename, "tcp")) == NULL)
- {
- return(-1);
- }
-
- bzero((char *)&Mysock, sizeof(Sockets));
- Mysock.Port = servrec->s_port; /* Service Port in Network Byte Order */
- return(1);
- }
- int InitPassiveSock(char * servicename)
- /* Initialize Passive Socket. If succeed then return 1, else return error code (<0) */
- /* 此函数用于需要被动套接字的服务器程序,它除了获取服务信息外,还建立一个被动套接字.*/
- {
- int mainsock, flag=1;
- struct servent *servrec;
- struct sockaddr_in serv_addr;
- if ((servrec = getservbyname(servicename, "tcp")) == NULL)
- {
- return(-1);
- }
-
- bzero((char *)&Mysock, sizeof(Sockets));
- Mysock.Port = servrec->s_port; /* Service Port in Network Byte Order */
- if((mainsock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- {
- return(-2);
- }
- bzero((char *)&serv_addr, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 任意网络接口 */
- serv_addr.sin_port = servrec->s_port;
- if (bind(mainsock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
- {
- close(mainsock);
- return(-3);
- }
- if (listen(mainsock, 5) == -1) /* 将主动套接字变为被动套接字,准备好接收连接 */
- {
- close(mainsock);
- return(-4);
- }
- /* Set this socket as a Non-blocking socket. */
- if (ioctl(mainsock, FIONBIO, &flag) == -1)
- {
- close(mainsock);
- return(-5);
- }
- Mysock.DaemonSock = mainsock;
- FD_SET(mainsock, &Mysock.readfds); /* 申明对主套接字“可读”感兴趣 */
- FD_SET(mainsock, &Mysock.exceptfds); /* 申明对主套接字上例外事件感兴趣 */
- return(1);
- }
- void CloseMainSock()
- /* 关闭主套接字,并清除对它上面事件的申明.在程序结束前关闭主套接字是一个好习惯 */
- {
- close(Mysock.DaemonSock);
- FD_CLR(Mysock.DaemonSock, &Mysock.readfds);
- FD_CLR(Mysock.DaemonSock, &Mysock.exceptfds);
- }
- int CreateConnection(struct in_addr *sin_addr)
- /* Create a Connection to remote host which IP address is in sin_addr.
- Param: sin_addr indicates the IP address in Network Byte Order.
- if succeed return the socket number which indicates this connection,
- else return error code (<0) */
- {
- struct sockaddr_in server; /* server address */
- int tmpsock, flag=1, i;
- if ((tmpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- return(-1);
- server.sin_family = AF_INET;
- server.sin_port = Mysock.Port;
- server.sin_addr.s_addr = sin_addr->s_addr;
- /* Set this socket as a Non-blocking socket. */
- if (ioctl(tmpsock, FIONBIO, &flag) == -1)
- {
- close(tmpsock);
- return(-2);
- }
- /* Connect to the server. */
- if (connect(tmpsock, (struct sockaddr *)&server, sizeof(server)) < 0)
- {
- if ((errno != EWOULDBLOCK) && (errno != EINPROGRESS))
- {
- /* 如果错误代码是EWOULDBLOCK和EINPROGRESS,则不用关闭套接字,
- 因为系统将在之后继续为套接字建立连接,连接是否建立成功可用select()函数来检测套接字是否“可写”来确定.*/
- close(tmpsock);
- return(-3); /* Connect error. */
- }
- }
- FD_SET(tmpsock, &Mysock.readfds);
- FD_SET(tmpsock, &Mysock.writefds);
- FD_SET(tmpsock, &Mysock.exceptfds);
-
- i = 0;
- while (Mysock.Sockets != 0) i++; /* look for a blank sockets position */
- if (i >= 64)
- {
- close(tmpsock);
- return(-4); /* too many connections */
- }
- Mysock.Sockets = tmpsock;
- Mysock.SockNum++;
- return(i);
- }
- int AcceptConnection(struct in_addr *IPaddr)
- /* Accept a connection. If succeed, return the data sockets number, else return -1. */
- {
- int newsock, len, flag=1, i;
- struct sockaddr_in addr;
- len = sizeof(addr);
- bzero((char *)&addr, len);
- if ((newsock = accept(Mysock.DaemonSock, &addr, &len)) == -1)
- return(-1); /* Accept error. */
- /* Set this socket as a Non-blocking socket. */
- ioctl(newsock, FIONBIO, &flag);
- FD_SET(newsock, &Mysock.readfds);
- FD_SET(newsock, &Mysock.writefds);
- FD_SET(newsock, &Mysock.exceptfds);
-
- /* Return IP address in the Parameter. */
- IPaddr->s_addr = addr.sin_addr.s_addr;
- i = 0;
- while (Mysock.Sockets != 0) i++; /* look for a blank sockets position */
- if (i >= 64)
- {
- close(newsock);
- return(-4); /* too many connections */
- }
-
- Mysock.Sockets = newsock;
- Mysock.SockNum++;
- return(i);
- }
- int CloseConnection(int Sockno)
- /* Close a connection indicated by Sockno. */
- {
- int retcode;
- if ((Sockno >= 64) || (Sockno < 0) || (Mysock.Sockets[Sockno] == 0))
- return(0);
- retcode = close(Mysock.Sockets[Sockno]);
- FD_CLR(Mysock.Sockets[Sockno], &Mysock.readfds);
- FD_CLR(Mysock.Sockets[Sockno], &Mysock.writefds);
- FD_CLR(Mysock.Sockets[Sockno], &Mysock.exceptfds);
- Mysock.Sockets[Sockno] = 0;
- Mysock.SockNum--;
- return(retcode);
- }
- int QuerySocketsMsg()
- /* Query Sockets Message. If succeed return message number, else return -1.
- The message information stored in struct SockMsg. */
- {
- fd_set rfds, wfds, efds;
- int retcode, i;
- struct timeval TimeOut;
-
- rfds = Mysock.readfds;
- wfds = Mysock.writefds;
- efds = Mysock.exceptfds;
- TimeOut.tv_sec = 0; /* 立即返回,不阻塞.*/
- TimeOut.tv_usec = 0;
-
- bzero((char *)&SockMsg, sizeof(SockMsg));
- if ((retcode = select(64, &rfds, &wfds, &efds, &TimeOut)) == 0)
- return(0);
- if (FD_ISSET(Mysock.DaemonSock, &rfds))
- SockMsg.AcceptNum = 1; /* some client call server. */
- for (i=0; i<64; i++) /* Data in message */
- {
- if ((Mysock.Sockets > 0) && (FD_ISSET(Mysock.Sockets, &rfds)))
- SockMsg.ReadQueue[SockMsg.ReadNum++] = i;
- }
- for (i=0; i<64; i++) /* Data out ready message */
- {
- if ((Mysock.Sockets > 0) && (FD_ISSET(Mysock.Sockets, &wfds)))
- SockMsg.WriteQueue[SockMsg.WriteNum++] = i;
- }
- if (FD_ISSET(Mysock.DaemonSock, &efds))
- SockMsg.AcceptNum = -1; /* server socket error. */
- for (i=0; i<64; i++) /* Error message */
- {
- if ((Mysock.Sockets > 0) && (FD_ISSET(Mysock.Sockets, &efds)))
- SockMsg.ExceptQueue[SockMsg.ExceptNum++] = i;
- }
-
- return(retcode);
- }
- int SendPacket(int Sockno, void *buf, int len)
- /* Send a packet. If succeed return the number of send data, else return -1 */
- {
- int actlen;
- if ((Sockno >= 64) || (Sockno < 0) || (Mysock.Sockets[Sockno] == 0))
- return(0);
- if ((actlen = send(Mysock.Sockets[Sockno], buf, len, 0)) < 0)
- return(-1);
-
- return(actlen);
- }
- int RecvPacket(int Sockno, void *buf, int size)
- /* Receive a packet. If succeed return the number of receive data, else if the connection
- is shutdown by peer then return 0, otherwise return 0-errno */
- {
- int actlen;
- if ((Sockno >= 64) || (Sockno < 0) || (Mysock.Sockets[Sockno] == 0))
- return(0);
-
- if ((actlen = recv(Mysock.Sockets[Sockno], buf, size, 0)) < 0)
- return(0-errno);
-
- return(actlen); /* actlen是接收的数据长度,如果为零,指示连接被对方关闭.*/
- }
复制代码 |
|