#include #include #include #include #include #include #include #include #include char bigData[30000]; int done = 0; int initServerSocket(int portNum) { int socketId[1], ret, option = 1; struct sockaddr_in addressInfo; *socketId = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (*socketId < 0) { return -1; } addressInfo.sin_family = AF_INET; addressInfo.sin_addr.s_addr = htonl(INADDR_ANY); addressInfo.sin_port = htons(portNum); ret = bind(*socketId, (struct sockaddr *) &addressInfo, sizeof(addressInfo)); if (ret < 0) { return -1; } return *socketId; } int main() { memset(bigData, 'a', 30000); bigData[29999] = '\0'; signed int socket = initServerSocket(12345); if(socket == -1) { return -1; } const int flags = fcntl(socket, F_GETFL, 0); fcntl(socket, F_SETFL, flags ^ O_NONBLOCK); int ret = listen(socket, 5); if (ret < 0) { return -1; } while(!done) { struct sockaddr_in addrInfoFromClient; int retSharedSocketIdWithClient; socklen_t sizeAddrInfo = sizeof(addrInfoFromClient); memset(&addrInfoFromClient, 0, sizeof(addrInfoFromClient)); char buf[128]; retSharedSocketIdWithClient = accept4(socket, (struct sockaddr *) &addrInfoFromClient, &sizeAddrInfo, SOCK_NONBLOCK); if (retSharedSocketIdWithClient >= 0) { int i = recv(retSharedSocketIdWithClient, buf, sizeof(buf), 0); printf("received: %d bytes\n", i); printf("received: %s\n", buf); i = send(retSharedSocketIdWithClient, bigData, strlen(bigData), 0); if(i < strlen(bigData)) { i += send(retSharedSocketIdWithClient, bigData + i, strlen(bigData) - i, 0); } shutdown(retSharedSocketIdWithClient, SHUT_WR); printf("sent %d bytes\n", i); done = 1; } } return 0; }