Advertisement
Guest User

Untitled

a guest
Jul 30th, 2014
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <string.h>
  5. #define PORT 45894
  6.  
  7. #ifdef WIN32
  8. #include <winsock2.h>
  9. #include <windows.h>
  10.  
  11. #define ERRORME(x) == (x)
  12.  
  13. #else
  14. #include <sys/types.h>
  15. #include <sys/socket.h>
  16. #include <netinet/in.h>
  17.  
  18. #define ERRORME(x) < 0
  19.  
  20. #endif //WIN32
  21.  
  22. struct connection {
  23. #ifdef WIN32
  24. SOCKET sockfd;
  25. #else
  26. int sockfd;
  27. #endif //WIN32
  28. int run, n;
  29. struct sockaddr_in partner;
  30. };
  31.  
  32. void start(int type);
  33. void *userIn(void *arg);
  34. void userRecv(void *arg);
  35.  
  36. int main(int argc, char **argv) {
  37. #ifdef WIN32
  38. WSADATA wsa;
  39. if (WSAStartup(MAKEWORD(2, 0), &wsa) < 0) {
  40. printf("Error starting wsa: %d\n", WSAGetLastError());
  41. return -1;
  42. }
  43. #endif //WIN32
  44.  
  45. char buf[256];
  46. int type;
  47. printf("Enter type! 1 for server, 2 for client!");
  48. fgets(buf, 256, stdin);
  49. sscanf(buf, "%d", &type);
  50.  
  51. start(type);
  52.  
  53. #ifdef WIN32
  54. WSACleanup();
  55. #endif //WIN32
  56.  
  57. return 0;
  58. }
  59.  
  60. void start(int type) {
  61. if (type == 1) {
  62. struct connection s;
  63.  
  64. #ifdef WIN32
  65. SOCKET sockfd, newsockfd;
  66. int clisize;
  67. #else
  68. int sockfd, newsockfd;
  69. socklen_t clisize;
  70. #endif //WIN32
  71.  
  72. struct sockaddr_in server, client;
  73. memset(&server, 0, sizeof(server));
  74.  
  75. server.sin_family = AF_INET;
  76. server.sin_port = htons(PORT);
  77. server.sin_addr.s_addr = INADDR_ANY;
  78.  
  79. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) ERRORME(INVALID_SOCKET)) {
  80. #ifdef WIN32
  81. closesocket(sockfd);
  82. printf("Error creating socket: %d\n", WSAGetLastError());
  83. #else
  84. close(sockfd);
  85. printf("Error creating socket.\n");
  86. #endif //WIN32
  87.  
  88. return;
  89. }
  90.  
  91. if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) ERRORME(SOCKET_ERROR)) {
  92. #ifdef WIN32
  93. printf("Error binding socket: %d\n", WSAGetLastError());
  94. closesocket(sockfd);
  95. #else
  96. perror("Error binding socket.\n");
  97. close(sockfd);
  98. #endif //WIN32
  99.  
  100. return;
  101. }
  102.  
  103. listen(sockfd, 0);
  104.  
  105. clisize = sizeof(client);
  106. if ((newsockfd = accept(sockfd, (struct sockaddr *)&client, &clisize)) ERRORME(INVALID_SOCKET)) {
  107. #ifdef WIN32
  108. printf("Error accepting connection: %d\n", WSAGetLastError());
  109. closesocket(sockfd);
  110. #else
  111. printf("Error accepting connection.\n");
  112. close(sockfd);
  113. #endif //WIN32
  114.  
  115. return;
  116. }
  117.  
  118. send(newsockfd, "Connected.\n", 12, 0);
  119.  
  120. s.sockfd = newsockfd;
  121. s.run = 1;
  122. s.partner = client;
  123.  
  124. pthread_t input;
  125. pthread_create(&input, NULL, userIn, &s);
  126.  
  127. userRecv(&s);
  128.  
  129. #ifdef WIN32
  130. closesocket(newsockfd);
  131. closesocket(sockfd);
  132. #else
  133. close(newsockfd);
  134. close(sockfd);
  135. #endif //WIN32
  136.  
  137. return;
  138. } else if (type == 2) {
  139. struct connection c;
  140.  
  141. #ifdef WIN32
  142. SOCKET sockfd;
  143. #else
  144. int sockfd;
  145. #endif //WIN32
  146.  
  147. struct sockaddr_in server;
  148. memset(&server, 0, sizeof(server));
  149.  
  150. server.sin_port = htons(PORT);
  151. server.sin_family = AF_INET;
  152.  
  153. printf("Enter IP to connect to: ");
  154. char in[256];
  155. char ip[15];
  156. fgets(in, 256, stdin);
  157. sscanf(in, "%s\n", ip);
  158.  
  159. server.sin_addr.s_addr = inet_addr(ip);
  160.  
  161. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) ERRORME(INVALID_SOCKET)) {
  162. #ifdef WIN32
  163. printf("Error creating socket: %d\n", WSAGetLastError());
  164. #else
  165. printf("Error creating socket.\n");
  166. #endif //WIN32
  167.  
  168. return;
  169. }
  170.  
  171. if (connect(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0) {
  172. #ifdef WIN32
  173. printf("Error conencting: %d\n", WSAGetLastError());
  174. #else
  175. printf("Error connecting.\n");
  176. #endif //WIN32
  177.  
  178. return;
  179. }
  180.  
  181. send(sockfd, "Connected.\n", 12, 0);
  182.  
  183. c.sockfd = sockfd;
  184. c.run = 1;
  185. c.partner = server;
  186.  
  187. pthread_t input;
  188. pthread_create(&input, NULL, userIn, &c);
  189.  
  190. userRecv(&c);
  191.  
  192. #ifdef WIN32
  193. closesocket(sockfd);
  194. #else
  195. close(sockfd);
  196. #endif //WIN32
  197.  
  198. return;
  199. } else {
  200. printf("Error! Invalid type!");
  201. return;
  202. }
  203. }
  204.  
  205. void *userIn(void *arg) {
  206. struct connection *me = (struct connection *)arg;
  207. char buffer[512];
  208. char test[7];
  209. while(me->run) {
  210. memset(buffer, 0, 512);
  211. memset(test, 0, 6);
  212.  
  213. fgets(buffer, 512, stdin);
  214.  
  215. memcpy(test, &buffer, 6);
  216. if(strlen(buffer) > 6) {
  217. test[6] = '\0';
  218. if (strcmp(test, "~QUIT~") == 0) {
  219. me->run = 0;
  220. send(me->sockfd, "~QUIT~", 7, 0);
  221. } else
  222. send(me->sockfd, buffer, strlen(buffer), 0);
  223. } else
  224. send(me->sockfd, buffer, strlen(buffer), 0);
  225. }
  226. }
  227.  
  228. void userRecv(void *arg) {
  229. struct connection *me = (struct connection *)arg;
  230. char buffer[256];
  231. while(me->run) {
  232. if ((me->n = recv(me->sockfd, (char *)buffer, 255, 0)) < 0) {
  233. #ifdef WIN32
  234. printf("Error at recv: %d\n", WSAGetLastError());
  235. #else
  236. printf("Error at recv\n");
  237. #endif //WIN32
  238.  
  239. me->run = 0;
  240. return;
  241. }
  242.  
  243. buffer[(me->n)] = '\0';
  244. if (strcmp(buffer,"~QUIT~") == 0) {
  245. me->run = 0;
  246. return;
  247. }
  248. printf("Buddy: %s", buffer);
  249. }
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement