Hi all
in Linux, with ICC (16.0.3 on IA-32) I can compile a socket.c file and hence I can make a .a file
which contains the following C program (see below for <socket.c>)
But in WINDOWS [7] version of ICL (16.0.3) I couldnt successfully compile it....
(I tried added such as ...
#ifdef WIN32
#include "winsock.h"
#include "winsock2.h"
#include <windows.h>
#else
#include <sys/socket.h>
#include <sys/un.h>
#endif
etc. but no use of it ....)
Here I need an advice - how I can I compile this file in Windows using ICL (intels C) compiler ?
I really need this file to make a porting job - which port a linux application into Windows. Please also note that
The same file is compiled in GCC of Cygwin in windows without any trouble !
Haopy some can help me
With best regards
Krishna mohan
/* A minimal wrapper for socket communication. Copyright (C) 2013, Joshua More and Michele Ceriotti Copyright (C) 2016, Bálint Aradi (adapted to F2003 C-bindings) ... Functions: error: Prints an error message and then exits. open_socket_: Opens a socket with the required host server, socket type and port number. write_buffer_: Writes a string to the socket. read_buffer_: Reads data from the socket. */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/un.h> #include <netdb.h> void connect_inet_socket(int *psockfd, const char* host, int port) /* Opens an internet socket. Note that fortran passes an extra argument for the string length, but this is ignored here for C compatibility. Args: psockfd: The id of the socket that will be created. port: The port number for the socket to be created. Low numbers are often reserved for important channels, so use of numbers of 4 or more digits is recommended. host: The name of the host server. */ { int sockfd, ai_err; // creates an internet socket // fetches information on the host struct addrinfo hints, *res; char service[256]; memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_STREAM; hints.ai_family = AF_UNSPEC; hints.ai_flags = AI_PASSIVE; sprintf(service, "%d", port); // convert the port number to a string ai_err = getaddrinfo(host, service, &hints, &res); if (ai_err!=0) { printf("Error code: %i\n",ai_err); perror("Error fetching host data. Wrong host name?"); exit(-1); } // creates socket sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (sockfd < 0) { perror("Error opening socket"); exit(-1); } // makes connection if (connect(sockfd, res->ai_addr, res->ai_addrlen) < 0) { perror("Error opening INET socket: wrong port or server unreachable"); exit(-1); } freeaddrinfo(res); *psockfd = sockfd; } void connect_unix_socket(int *psockfd, const char* pathname) /* Opens a unix socket. Note that fortran passes an extra argument for the string length, but this is ignored here for C compatibility. Args: psockfd: The id of the socket that will be created. pathname: The name of the file to use for sun_path. */ { int sockfd, ai_err; struct sockaddr_un serv_addr; printf("Connecting to :%s:\n",pathname); // fills up details of the socket addres memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sun_family = AF_UNIX; /* Beware of buffer over runs UNIX Network Programming by Richard Stevens mentions that the use of sizeof() is ok, but see http://mail-index.netbsd.org/tech-net/2006/10/11/0008.html */ if ((int)strlen(pathname)> sizeof(serv_addr.sun_path)) { perror("Error opening UNIX socket: pathname too long\n"); exit(-1); } else { strcpy(serv_addr.sun_path, pathname); } // creates a unix socket // creates the socket sockfd = socket(AF_UNIX, SOCK_STREAM, 0); // connects if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("Error opening UNIX socket: path unavailable, or already existing"); exit(-1); } *psockfd = sockfd; } void writebuffer_socket(int sockfd, const void *data, int len) /* Writes to a socket. Args: sockfd: The id of the socket that will be written to. data: The data to be written to the socket. len: The length of the data in bytes. */ { int n; n = write(sockfd, (char *) data, len); if (n < 0) { perror("Error writing to socket: server has quit or connection broke"); exit(-1); } } void readbuffer_socket(int sockfd, void *data, int len) /* Reads from a socket. Args: sockfd: The id of the socket that will be read from. data: The storage array for data read from the socket. len: The length of the data in bytes. */ { int n, nr; char *pdata; pdata = (char *) data; n = nr = read(sockfd, pdata, len); while (nr > 0 && n < len) { nr = read(sockfd, &(pdata[n]), len - n); n += nr; } if (n == 0) { perror("Error reading from socket: server has quit or connection broke"); exit(-1); } } void shutdown_socket(int sockfd) /* Shuts down the socket. */ { shutdown(sockfd, 2); close(sockfd); }