Greetings,
I am new to the forums and I want to say I have gained a pretty good foundation off of here the last two years or so. I have been accommodating myself with the sockets API and I wanted to try a project. I have a client and server as usual. Below is my server. It is meant to receive STDOUT from a remote client and "puts" it in the entirety to the screen. No matter how much I increase the buffer size, there is a cut off from my puts output. I run wireshark and tested in out on loopback and I can see my execve netstat in the TCP stream altogether as it should be. I am afraid I am not accounting for something.
server:
Code:
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#define BUFFSIZE 6000
int main( int argc, char *argv[] ) {
if (argc < 2 || argc > 2) {
puts("<port>");
exit(1);
}
//Variables
in_port_t servPort = atoi(argv[1]);
char buffer[BUFFSIZE];
//CREATE SOCKET
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//STRUCTURES
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(servPort);
//Bind
bind(sock, (struct sockaddr *) &server, sizeof(server));
//Listen
listen(sock, 10);
for (;;) {
//CLIENTstruct
struct sockaddr_in client;
socklen_t clientLen = sizeof(client);
//ACCEPT
int cliSock;
cliSock = accept(sock, (struct sockaddr *) &client, &clientLen);
read(cliSock,buffer,BUFFSIZE);
puts(buffer);
}
return 0;
}
client:
Code:
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("<server><port>\n");
exit(1);
}
//Variables
char *servIP = argv[1];
in_port_t servPort = atoi(argv[2]);
//CREATE SOCKET
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//STRUCTURES
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
//CONVERTADDRESS
inet_pton(AF_INET, servIP, &server.sin_addr.s_addr);
server.sin_port = htons(servPort);
//CONNECT
connect(sock, (struct sockaddr *) &server, sizeof(server));
//DUP2 SEND STDIN AND ERR OVER SOCKET
dup2(sock, STDOUT_FILENO);
dup2(sock, STDERR_FILENO);
//EXECVE LINUX SYSTEM CALL
char *execargv[] = {"/bin/netstat", "-an", NULL }; //Initialize and fill arrays with exec values
char *environ[] = {NULL};
execve("/bin/netstat", execargv, environ); //perform execve
return 0;
}