45 #include <sys/socket.h>
46 #include <arpa/inet.h>
55 struct sockaddr_in addr;
57 if ((*network_connection = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
63 addr.sin_family = AF_INET;
66 addr.sin_addr.s_addr = inet_addr(ip);
70 addr.sin_addr.s_addr = htonl(INADDR_ANY);
72 addr.sin_port = htons(port);
75 if (bind(*network_connection, (
struct sockaddr *) &addr,
sizeof(addr)) < 0)
84 void DieWithError(
n_string errorMessage)
90 void HandleTCPClient(
n_c_int clntSocket)
96 if ((recvMsgSize = recv(clntSocket, echoBuffer,
sizeof(
n_constant_string), 0)) < 0)
97 DieWithError(
"recv() failed");
100 while (recvMsgSize > 0)
103 if (send(clntSocket, echoBuffer, recvMsgSize, 0) != recvMsgSize)
104 DieWithError(
"send() failed");
107 if ((recvMsgSize = recv(clntSocket, echoBuffer,
sizeof(
n_constant_string), 0)) < 0)
108 DieWithError(
"recv() failed");
113 #ifdef EXAMPLE_SERVER
115 int main(
int argc,
char *argv[])
119 struct sockaddr_in echoServAddr;
120 struct sockaddr_in echoClntAddr;
121 unsigned short echoServPort;
122 unsigned int clntLen;
126 fprintf(stderr,
"Usage: %s <Server Port>\n", argv[0]);
130 echoServPort = atoi(argv[1]);
133 if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
134 DieWithError(
"socket() failed");
137 memset(&echoServAddr, 0,
sizeof(echoServAddr));
138 echoServAddr.sin_family = AF_INET;
139 echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
140 echoServAddr.sin_port = htons(echoServPort);
143 if (bind(servSock, (
struct sockaddr *) &echoServAddr,
sizeof(echoServAddr)) < 0)
144 DieWithError(
"bind() failed");
147 if (listen(servSock, MAXPENDING) < 0)
148 DieWithError(
"listen() failed");
153 clntLen =
sizeof(echoClntAddr);
156 if ((clntSock = accept(servSock, (
struct sockaddr *) &echoClntAddr,
158 DieWithError(
"accept() failed");
162 printf(
"Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr));
164 HandleTCPClient(clntSock);
171 int main(
int argc,
char *argv[])
174 struct sockaddr_in echoServAddr;
175 unsigned short echoServPort;
178 char echoBuffer[RCVBUFSIZE];
179 unsigned int echoStringLen;
180 int bytesRcvd, totalBytesRcvd;
183 if ((argc < 3) || (argc > 4))
185 fprintf(stderr,
"Usage: %s <Server IP> <Echo Word> [<Echo Port>]\n",
191 echoString = argv[2];
194 echoServPort = atoi(argv[3]);
199 if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
200 DieWithError(
"socket() failed");
203 memset(&echoServAddr, 0,
sizeof(echoServAddr));
204 echoServAddr.sin_family = AF_INET;
205 echoServAddr.sin_addr.s_addr = inet_addr(servIP);
206 echoServAddr.sin_port = htons(echoServPort);
209 if (connect(sock, (
struct sockaddr *) &echoServAddr,
sizeof(echoServAddr)) < 0)
210 DieWithError(
"connect() failed");
212 echoStringLen = strlen(echoString);
215 if (send(sock, echoString, echoStringLen, 0) != echoStringLen)
216 DieWithError(
"send() sent a different number of bytes than expected");
220 printf(
"Received: ");
221 while (totalBytesRcvd < echoStringLen)
225 if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0)
226 DieWithError(
"recv() failed or connection closed prematurely");
227 totalBytesRcvd += bytesRcvd;
228 echoBuffer[bytesRcvd] =
'\0';
229 printf(
"%s", echoBuffer);