Last active
August 29, 2015 14:22
-
-
Save aleksandergurin/804ce510c9247db930c1 to your computer and use it in GitHub Desktop.
Simple echo client for linux
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <arpa/inet.h> | |
#include <unistd.h> | |
#include <stdio.h> | |
int main(int argc, char *argv[]) { | |
const char *SERVER_IP = "127.0.0.1"; | |
int fd = socket(AF_INET, SOCK_STREAM, 0); | |
if (fd == -1) { | |
fprintf(stderr, "Error on socket creation.\n"); | |
return 1; | |
} | |
struct sockaddr_in server_addr; | |
server_addr.sin_family = AF_INET; | |
server_addr.sin_port = htons(8080); | |
if (inet_pton(AF_INET, SERVER_IP, &(server_addr.sin_addr)) == -1) { | |
fprintf(stderr, "Invalid server IP address.\n"); | |
return 1; | |
} | |
struct timeval tv; | |
tv.tv_sec = 30; // 30 seconds timeout for send, revc | |
tv.tv_usec = 0; | |
if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, | |
(char *) &tv, sizeof(struct timeval)) == -1) { | |
fprintf(stderr, "Error on setting socket receive timeout.\n"); | |
return 1; | |
} | |
if (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, | |
(char *) &tv, sizeof(struct timeval)) == -1) { | |
fprintf(stderr, "Error on setting socket send timeout.\n"); | |
return 1; | |
} | |
if (connect(fd, (struct sockaddr *) &server_addr, | |
sizeof(server_addr)) == -1) { | |
fprintf(stderr, "Couldn't connect to server.\n"); | |
return 1; | |
} | |
char message[] = "Test message\n"; | |
int data_len = sizeof(message); | |
void *buf_pt = message; | |
int slen; | |
// Send message | |
while ((slen = send(fd, buf_pt, data_len, 0)) != 0) { | |
if (slen == -1) { | |
fprintf(stderr, "Error on sending data.\n"); | |
close(fd); | |
return 1; | |
} | |
data_len -= slen; | |
buf_pt += slen; | |
} | |
// Receive message | |
const int BUF_LEN = 2048; | |
char buf[BUF_LEN]; | |
int rlen; | |
int recv_data_len = 0; | |
while (recv_data_len < sizeof(message) | |
&& (rlen = recv(fd, buf, BUF_LEN, 0)) != 0) { | |
if (rlen == -1) { | |
fprintf(stderr, "Error on receiving data.\n"); | |
close(fd); | |
return 1; | |
} | |
fwrite(buf, 1, rlen, stdout); | |
recv_data_len += rlen; | |
} | |
close(fd); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment