Untitled
plain_text
a month ago
2.7 kB
1
Indexable
Never
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> ssize_t serversend(int new_fd, const char *outdata) { return send(new_fd, outdata, strlen(outdata), 0); } /* nbytes > 0:表示接收到了 nbytes 數量的字節。這是正常的數據接收。 nbytes == 0:表示連接已被對方關閉。 nbytes < 0:表示發生了錯誤。 */ ssize_t serverrecv(int new_fd, char *indata, size_t buflen) { ssize_t nbytes = recv(new_fd, indata, buflen - 1, 0); if(nbytes > 0) { indata[nbytes] = '\0'; //使用 null 終止符號 } return nbytes; } int main() { const char* host = "0.0.0.0"; int port = 7000; int sock_fd, new_fd; socklen_t addrlen; struct sockaddr_in my_addr, client_addr; int status; char indata[1024] = {0}, outdata[1024] = {0}; int on = 1; // create a socket sock_fd = socket(AF_INET, SOCK_STREAM, 0); if (sock_fd == -1) { perror("Socket creation error"); exit(1); } // for "Address already in use" error message if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int)) == -1) { perror("Setsockopt error"); exit(1); } // server address my_addr.sin_family = AF_INET; inet_aton(host, &my_addr.sin_addr); my_addr.sin_port = htons(port); status = bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(my_addr)); if (status == -1) { perror("Binding error"); exit(1); } printf("server start at: %s:%d\n", inet_ntoa(my_addr.sin_addr), port); status = listen(sock_fd, 5); if (status == -1) { perror("Listening error"); exit(1); } printf("wait for connection...\n"); addrlen = sizeof(client_addr); while (1) { new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &addrlen); printf("connected by %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); while (1) { memset(indata,0,sizeof(indata)); size_t nbytes =serverrecv(new_fd, indata, sizeof(indata)); //recv(new_fd, indata, sizeof(indata), 0); if (nbytes <= 0) { close(new_fd); printf("client closed connection.\n"); break; } indata[nbytes] = '\0'; printf("recv: %s\n", indata); snprintf(outdata, sizeof(outdata), "echo %s", indata); serversend(new_fd, outdata); } } close(sock_fd); return 0; }