<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: socket code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 27 Jul 2008 01:07:22 GMT</pubDate>
    <description>DZone Snippets: socket code</description>
    <item>
      <title>GET stream from the web using python</title>
      <link>http://snippets.dzone.com/posts/show/5722</link>
      <description>GETs files from a remote webserver. I'm using it for streaming&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def get(host,port,url):&lt;br /&gt;    h = httplib.HTTP(host, port)&lt;br /&gt;    h.putrequest('GET', url)&lt;br /&gt;    h.putheader('Host', host)&lt;br /&gt;    h.putheader('User-agent', 'python-httplib')&lt;br /&gt;    h.endheaders()&lt;br /&gt;&lt;br /&gt;    (returncode, returnmsg, headers) = h.getreply()&lt;br /&gt;    if returncode != 200:&lt;br /&gt;        print returncode, returnmsg&lt;br /&gt;        sys.exit()&lt;br /&gt;&lt;br /&gt;    f = h.getfile()&lt;br /&gt;    return f.read()&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 03 Jul 2008 10:15:44 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5722</guid>
      <author>zoltek (Prasanna Gautam)</author>
    </item>
    <item>
      <title>One-line web server in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/5424</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# From: http://www.ntecs.de/blog/articles/2008/02/09/the-worlds-smallest-webserver&lt;br /&gt;# Author: Michael Neumann&lt;br /&gt;# ... point your browser to http://localhost:3125/etc/motd&lt;br /&gt;&lt;br /&gt;ruby -rsocket -e 's=TCPServer.new(5**5);loop{_=s.accept;_&lt;&lt;"HTTP/1.0 200 OK\r\n\r\n#{File.read(_.gets.split[1])rescue nil}";_.close}'&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 23 Apr 2008 13:22:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5424</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Run TCPServer as a simple Web server</title>
      <link>http://snippets.dzone.com/posts/show/5345</link>
      <description>A TCPServer accepts incoming TCP connections. Here is a Web server that listens on a given port and returns the time.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'socket'&lt;br /&gt;port = (ARGV[0] || 80).to_i&lt;br /&gt;server = TCPServer.new('localhost', port)&lt;br /&gt;while (session = server.accept)&lt;br /&gt;  puts "Request: #{session.gets}"&lt;br /&gt;  session.print "HTTP/1.1 200/OK\r\nContent-type: text/html\r\n\r\n"&lt;br /&gt;  session.print "&lt;html&gt;&lt;body&gt;&lt;h1&gt;#{Time.now}&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;\r\n"&lt;br /&gt;  session.close&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This code was copied from &lt;a href="http://www.rubycentral.com/pickaxe/lib_network.html"&gt;Programming Ruby: The Pragmatic Programmer's Guide&lt;/a&gt; [rubycentral.com] while looking for information on Ruby CGI global variables.</description>
      <pubDate>Thu, 10 Apr 2008 14:05:56 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5345</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Getting a client's IP address with EventMachine</title>
      <link>http://snippets.dzone.com/posts/show/5098</link>
      <description>This is from, and by: &lt;a href="http://nhw.pl/wp/2007/12/07/eventmachine-how-to-get-clients-ip-address/"&gt;http://nhw.pl/wp/2007/12/07/eventmachine-how-to-get-clients-ip-address/&lt;/a&gt; .. I just wanted a more permanent reference as it's cool code.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;EventMachine::run {&lt;br /&gt;   EventMachine::open_datagram_socket $conf[:address],&lt;br /&gt;                                 $conf[:udp_port], CustomServer&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;module CustomServer&lt;br /&gt;   def receive_data d&lt;br /&gt;      pp get_peername[2,6].unpack "nC4"&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 03 Feb 2008 20:12:09 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5098</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
    <item>
      <title>[Ruby] Script/bot to send MediaWiki Recent Changes over UDP to a Campfire room</title>
      <link>http://snippets.dzone.com/posts/show/5037</link>
      <description>Requires the Tinder gem, and PHP on the server running MediaWiki must be compiled with --enable-sockets. The computer running the bot will also have to be open to the web - it can't be behind a firewall.&lt;br /&gt;&lt;br /&gt;First, add this code to your MediaWiki LocalSettings.php, replacing the IP address with the IP of the server/computer running the bot, and the port to whatever you want to use (probably something above 40,000, but it's up to you):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$wgRC2UDPAddress = '69.178.6.244';&lt;br /&gt;$wgRC2UDPPort = '41895';&lt;br /&gt;$wgRC2UDPPrefix = "";&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now, you can run the bot! This is extremely hackish, because the retarded collective-mailing-list-coding system of the MediaWiki repos has somehow managed to code IRC color codes directly into their exported strings (at least with MediaWiki 1.2alpha, which is what I'm running right now).&lt;br /&gt;You'll need to replace the new tinder definition with your subdomain on Campfire, the username and password with ones for the bot account you've created on your campfire room, and the room name with the room you want the updates to be sent to.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'tinder'&lt;br /&gt;require 'socket'&lt;br /&gt;puts 'Dependencies loaded...'&lt;br /&gt;&lt;br /&gt;campfire = Tinder::Campfire.new 'subdomain'&lt;br /&gt;campfire.login 'email@domain.com', 'password'&lt;br /&gt;exit unless room = campfire.find_room_by_name('Case Sensitive Room Name')&lt;br /&gt;puts 'Campfire logged in...'&lt;br /&gt;&lt;br /&gt;server = UDPSocket.new&lt;br /&gt;exit unless server.bind('0.0.0.0', 41895)&lt;br /&gt;puts 'Socket listening...'&lt;br /&gt;&lt;br /&gt;loop do&lt;br /&gt;  msg = server.recv(2048).gsub(/\003[\d]{0,2}/,'').chomp&lt;br /&gt;  print "sending to room: #{msg.inspect}..."&lt;br /&gt;  exit unless room.speak msg.to_s&lt;br /&gt;  puts ' sent!'&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 26 Jan 2008 14:29:08 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5037</guid>
      <author>elliottcable (elliott cable)</author>
    </item>
    <item>
      <title>Resolving a tinyURL to destination URL</title>
      <link>http://snippets.dzone.com/posts/show/4591</link>
      <description>Resolving a tinyURL to its original destination URL in a fastest way.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    &lt; ?php&lt;br /&gt;&lt;br /&gt;    // request like this http://&lt;domain&gt;/tinyurl.php?c=&lt;tinyurl&gt;&lt;br /&gt;&lt;br /&gt;    $num = $_GET['c'];&lt;br /&gt;&lt;br /&gt;    if($fp = fsockopen ("tinyurl.com", 80, $errno, $errstr, 30))&lt;br /&gt;    {&lt;br /&gt;    if ($fp) {&lt;br /&gt;    fputs ($fp, "HEAD /$num HTTP/1.0\r\nHost: tinyurl.com\r\n\r\n");&lt;br /&gt;    while (!feof($fp)) {$headers .= fgets ($fp,128);}&lt;br /&gt;    fclose ($fp);&lt;br /&gt;    }&lt;br /&gt;    $arr1=explode("Location:",$headers);&lt;br /&gt;    $arr=explode("\n",trim($arr1[1]));&lt;br /&gt;    echo trim($arr[0]);&lt;br /&gt;    }&lt;br /&gt;    ?&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;http://www.webforth.com/2007/07/resolving-tinyurls-to-the-desination-url</description>
      <pubDate>Sun, 30 Sep 2007 08:05:34 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4591</guid>
      <author>mixdev (Arun Vijayan)</author>
    </item>
    <item>
      <title>Send custom UDP packets in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/4541</link>
      <description>&lt;br /&gt;From: http://www.ruby-forum.com/topic/124159&lt;br /&gt;Author: Bill Kelly&lt;br /&gt;&lt;br /&gt;For yet another nifty UDP snippet see &lt;a href="http://www.rubyinside.com/skype-style-firewall-busting-with-ruby-and-udp-399.html"&gt;Skype-Style Firewall Busting with Ruby and UDP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;require 'socket'&lt;br /&gt;&lt;br /&gt;#abort "Usage: server_addr, server_port, cmd_str" unless ARGV.length == 3&lt;br /&gt;&lt;br /&gt;UDP_RECV_TIMEOUT = 3  # seconds&lt;br /&gt;&lt;br /&gt;def q2cmd(server_addr, server_port, cmd_str)&lt;br /&gt;  resp, sock = nil, nil&lt;br /&gt;  begin&lt;br /&gt;   cmd = "\377\377\377\377#{cmd_str}\0"&lt;br /&gt;    sock = UDPSocket.open&lt;br /&gt;    sock.send(cmd, 0, server_addr, server_port)&lt;br /&gt;    resp = if select([sock], nil, nil, UDP_RECV_TIMEOUT)&lt;br /&gt;      sock.recvfrom(65536)&lt;br /&gt;    end&lt;br /&gt;    if resp&lt;br /&gt;      resp[0] = resp[0][4..-1]  # trim leading 0xffffffff&lt;br /&gt;    end&lt;br /&gt;  rescue IOError, SystemCallError&lt;br /&gt;  ensure&lt;br /&gt;    sock.close if sock&lt;br /&gt;  end&lt;br /&gt;  resp ? resp[0] : nil&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# your firewall has to allow communication with IP address 67.19.248.74 (port 27912)&lt;br /&gt;#server, port, cmd = *ARGV&lt;br /&gt;server = "tastyspleen.net"&lt;br /&gt;port = 27912&lt;br /&gt;cmd = "status"&lt;br /&gt;&lt;br /&gt;result = q2cmd(server, port, cmd)&lt;br /&gt;puts result&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Fri, 14 Sep 2007 11:19:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4541</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>J2ME - getIPdevice</title>
      <link>http://snippets.dzone.com/posts/show/3592</link>
      <description>// Retrevie IP device &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package org.socketdemo;&lt;br /&gt;&lt;br /&gt;import javax.microedition.io.Connector;&lt;br /&gt;import javax.microedition.io.SocketConnection;&lt;br /&gt;import javax.microedition.lcdui.Alert;&lt;br /&gt;import javax.microedition.lcdui.AlertType;&lt;br /&gt;import javax.microedition.lcdui.Command;&lt;br /&gt;import javax.microedition.lcdui.CommandListener;&lt;br /&gt;import javax.microedition.lcdui.Display;&lt;br /&gt;import javax.microedition.lcdui.Displayable;&lt;br /&gt;import javax.microedition.midlet.MIDlet;&lt;br /&gt;import javax.microedition.midlet.MIDletStateChangeException;&lt;br /&gt;&lt;br /&gt;public class SocketDEMO extends MIDlet implements CommandListener&lt;br /&gt;{&lt;br /&gt;	protected SocketDEMO midlet = this;&lt;br /&gt;	&lt;br /&gt;	private Alert info;&lt;br /&gt;	&lt;br /&gt;	protected void destroyApp(boolean value) throws MIDletStateChangeException&lt;br /&gt;	{&lt;br /&gt;		notifyDestroyed();&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	protected void pauseApp()&lt;br /&gt;	{&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	protected void startApp() throws MIDletStateChangeException&lt;br /&gt;	{&lt;br /&gt;		new Thread()&lt;br /&gt;		{&lt;br /&gt;			public void run()&lt;br /&gt;			{&lt;br /&gt;				SocketConnection socket = null;&lt;br /&gt;				&lt;br /&gt;				try&lt;br /&gt;				{&lt;br /&gt;					socket = (SocketConnection) Connector.open("socket://193.204.114.233:13");&lt;br /&gt;					&lt;br /&gt;					socket.openInputStream();&lt;br /&gt;					&lt;br /&gt;					info = new Alert("Info", "Current IP: " + socket.getLocalAddress() + "\nPort: " + socket.getLocalPort(), null, AlertType.INFO);&lt;br /&gt;					info.setTimeout(Alert.FOREVER);&lt;br /&gt;					info.setCommandListener(midlet);&lt;br /&gt;					&lt;br /&gt;					getDisplay().setCurrent(info);&lt;br /&gt;				}&lt;br /&gt;				catch(Exception error)&lt;br /&gt;				{&lt;br /&gt;					info = new Alert("Info", "Current IP: N/A\nPort: N/A", null, AlertType.INFO);&lt;br /&gt;					info.setTimeout(Alert.FOREVER);&lt;br /&gt;					info.setCommandListener(midlet);&lt;br /&gt;					&lt;br /&gt;					getDisplay().setCurrent(info);&lt;br /&gt;				}&lt;br /&gt;				finally&lt;br /&gt;				{&lt;br /&gt;					if(socket != null)&lt;br /&gt;					{&lt;br /&gt;						try&lt;br /&gt;						{&lt;br /&gt;							socket.close();&lt;br /&gt;						}&lt;br /&gt;						catch(Exception error)&lt;br /&gt;						{&lt;br /&gt;							&lt;br /&gt;						}&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}.start();&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	protected Display getDisplay()&lt;br /&gt;	{&lt;br /&gt;		return Display.getDisplay(this);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public void commandAction(Command cmd, Displayable dsp)&lt;br /&gt;	{&lt;br /&gt;		if(cmd == Alert.DISMISS_COMMAND)&lt;br /&gt;		{&lt;br /&gt;			try&lt;br /&gt;			{&lt;br /&gt;				destroyApp(true);&lt;br /&gt;			}&lt;br /&gt;			catch(MIDletStateChangeException error)&lt;br /&gt;			{&lt;br /&gt;			&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 28 Feb 2007 00:15:46 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3592</guid>
      <author>whitetiger ()</author>
    </item>
    <item>
      <title>Python - SendSMS over BT and AT</title>
      <link>http://snippets.dzone.com/posts/show/3041</link>
      <description>// Send SMS over Bluetooth (AT Command)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import bluetooth&lt;br /&gt;&lt;br /&gt;sockfd = bluetooth.BluetoothSocket(bluetooth.RFCOMM)&lt;br /&gt;sockfd.connect(('00:00:00:00:00:00', 1)) # BT Address&lt;br /&gt;sockfd.send('ATZ\r')&lt;br /&gt;sockfd.send('AT+CMGF=1\r')&lt;br /&gt;sockfd.send('AT+CSCA="+393359609600"\r') # Client TIM ITA&lt;br /&gt;sockfd.send('AT+CMGS="+39xxxxxxxxxx"\r') # TO PhoneNumber&lt;br /&gt;sockfd.send('Messaggio da mandare...\n')&lt;br /&gt;sockfd.send(chr(26)) # CTRL+Z&lt;br /&gt;sockfd.close()&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 26 Nov 2006 21:31:03 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3041</guid>
      <author>whitetiger ()</author>
    </item>
    <item>
      <title>Windows socket demo program -- uses threads and stuff -- for stress testing the TCP stack</title>
      <link>http://snippets.dzone.com/posts/show/2471</link>
      <description>// I wrote this to find out if the claims made at http://laurentszyster.be/blog/tcp-stack-flaking-out/ is &lt;br /&gt;// valid.  I disagree with the opinions of the person who posted that TCP flakes out on Windows. I think&lt;br /&gt;// his program has obvious bugs.  This program proves that as long as you write your code properly&lt;br /&gt;// the TCP connections do not break randomly. Similar bugs existed in Bittorrent apparently, and they fixed them.&lt;br /&gt;// For more information visit http://sparebandwidth.blogspot.com/2006/08/more-on-tcp-flaking-out.html&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#define BUFFER_SIZE 1000&lt;br /&gt;#define SERVER_ADDR "127.0.0.1"&lt;br /&gt;#define SERVER_PORT 9999&lt;br /&gt;#define NUM_THREADS 1000&lt;br /&gt;#define SEND_SOCK_BUFFER_SIZE 34000&lt;br /&gt;#define RECV_SOCK_BUFFER_SIZE  34000&lt;br /&gt;#define SERVER_RECV_SOCK_BUFFER_SIZE  34000&lt;br /&gt;#define SERVER_SEND_SOCK_BUFFER_SIZE 34000&lt;br /&gt;#define CLIENT_LIMIT 1000	/* how many times to send/recv in client */&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;     &lt;br /&gt;#define FD_SETSIZE  NUM_THREADS&lt;br /&gt;#include &lt;winsock.h&gt;   &lt;br /&gt;#include &lt;stdlib.h&gt;    &lt;br /&gt;&lt;br /&gt;#define fatal_error(arg) {\&lt;br /&gt;		fprintf(stderr,"total in %d out %d, %s: %d\n",		\&lt;br /&gt;			total_bytes_received, total_bytes_sent,		\&lt;br /&gt;			arg, WSAGetLastError()); fflush(stderr); exit(1); }&lt;br /&gt;#define fatal_error2(arg)  { fprintf(stderr, "%s", arg); fflush(stderr); exit(1);}&lt;br /&gt;&lt;br /&gt;int threads_all_done = 0;&lt;br /&gt;&lt;br /&gt;struct thread_args {&lt;br /&gt;	int id;&lt;br /&gt;	int server_sock;&lt;br /&gt;	struct sockaddr_in server_addr;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void *client_thread(void *args)&lt;br /&gt;{&lt;br /&gt;	struct thread_args *client_thread_arg;&lt;br /&gt;	struct sockaddr_in server_addr;&lt;br /&gt;	int server_sock;&lt;br /&gt;	int client_sock;&lt;br /&gt;	int on = 1;&lt;br /&gt;	int bytes_received, bytes_sent;&lt;br /&gt;	int num_to_read;&lt;br /&gt;	int total_bytes_received, total_bytes_sent;&lt;br /&gt;	char buffer[BUFFER_SIZE];&lt;br /&gt;	int size;&lt;br /&gt;	int i;&lt;br /&gt;&lt;br /&gt;	total_bytes_received = total_bytes_sent = 0;&lt;br /&gt;	&lt;br /&gt;	client_thread_arg = (struct thread_args *)args;&lt;br /&gt;	memcpy(&amp;server_addr, &amp;client_thread_arg-&gt;server_addr,&lt;br /&gt;	       sizeof(struct sockaddr_in));&lt;br /&gt;	server_sock = client_thread_arg-&gt;server_sock;&lt;br /&gt;&lt;br /&gt;	if ((client_sock = socket(PF_INET, SOCK_STREAM,&lt;br /&gt;				  IPPROTO_TCP)) &lt; 0)&lt;br /&gt;		fatal_error("socket() error in client thread");&lt;br /&gt;&lt;br /&gt;	if (connect(client_sock, (struct sockaddr *)&amp;server_addr,&lt;br /&gt;		    sizeof(server_addr)) &lt; 0)&lt;br /&gt;		fatal_error("connect() error in client thread");&lt;br /&gt;&lt;br /&gt;	/* wait for the server to send startup message */&lt;br /&gt;	if ((bytes_received =&lt;br /&gt;	     recv(client_sock, buffer, BUFFER_SIZE, 0)) &lt; 0)&lt;br /&gt;		fatal_error("recv() error in client thread");&lt;br /&gt;&lt;br /&gt;	if (ioctlsocket(client_sock, FIONBIO, &amp;on) &lt; 0)&lt;br /&gt;		fatal_error("FIONBIO error in client thread");&lt;br /&gt;&lt;br /&gt;	size = SEND_SOCK_BUFFER_SIZE;&lt;br /&gt;	if (setsockopt(client_sock, SOL_SOCKET, SO_SNDBUF, &amp;size, sizeof(size)) &lt; 0)&lt;br /&gt;		fatal_error("SO_SNDBUF error in client thread");&lt;br /&gt;	size = RECV_SOCK_BUFFER_SIZE;&lt;br /&gt;	if (setsockopt(client_sock, SOL_SOCKET, SO_RCVBUF, &amp;size, sizeof(size)) &lt; 0)&lt;br /&gt;		fatal_error("SO_RCVBUF error in client thread");&lt;br /&gt;	&lt;br /&gt;	for (i = 0; i &lt; CLIENT_LIMIT ; i++) {&lt;br /&gt;		int errno;&lt;br /&gt;		&lt;br /&gt;		if ((bytes_sent =&lt;br /&gt;		     send(client_sock, buffer,&lt;br /&gt;			  BUFFER_SIZE, 0)) != BUFFER_SIZE) {&lt;br /&gt;			errno = WSAGetLastError();&lt;br /&gt;			if (errno == WSAEWOULDBLOCK ||&lt;br /&gt;				errno == WSAENOBUFS)&lt;br /&gt;				continue;&lt;br /&gt;			&lt;br /&gt;			fatal_error("send() error in client thread");&lt;br /&gt;		}&lt;br /&gt;		total_bytes_sent += bytes_sent;&lt;br /&gt;&lt;br /&gt;		num_to_read = 0;&lt;br /&gt;		if (ioctlsocket(client_sock, FIONREAD, &amp;num_to_read) &lt; 0) &lt;br /&gt;			fatal_error("FIONREAD error in client thread");&lt;br /&gt;		&lt;br /&gt;		if (num_to_read == 0)&lt;br /&gt;			continue;&lt;br /&gt;		&lt;br /&gt;		if ((bytes_received =&lt;br /&gt;		     recv(client_sock, buffer, &lt;br /&gt;			  num_to_read &gt;= BUFFER_SIZE ?&lt;br /&gt;			  BUFFER_SIZE - 1 : num_to_read, 0)) &lt;= 0)&lt;br /&gt;			fatal_error("recv() error in client thread");&lt;br /&gt;		total_bytes_received += bytes_received; 		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	printf("thread %d total bytes received %d sent %d\n",&lt;br /&gt;	       client_thread_arg-&gt;id, total_bytes_received, total_bytes_sent);&lt;br /&gt;&lt;br /&gt;#if 0&lt;br /&gt;	closesocket(client_sock);&lt;br /&gt;#endif&lt;br /&gt;	free(args);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void *starter_thread(void *args)&lt;br /&gt;{&lt;br /&gt;	HANDLE thread_handles[NUM_THREADS];&lt;br /&gt;	DWORD thread_ids[NUM_THREADS];&lt;br /&gt;	struct thread_args *client_thread_arg;&lt;br /&gt;	int i;&lt;br /&gt;	&lt;br /&gt;	for (i = 0; i &lt; NUM_THREADS; i++) {&lt;br /&gt;		if ((client_thread_arg = &lt;br /&gt;		     (struct thread_args *)&lt;br /&gt;		     malloc(sizeof(struct thread_args))) == 0) &lt;br /&gt;			fatal_error2("malloc client_thread_arg error");&lt;br /&gt;		&lt;br /&gt;		memcpy(client_thread_arg, args, sizeof(struct thread_args));&lt;br /&gt;		client_thread_arg-&gt;id = i;&lt;br /&gt;&lt;br /&gt;		if ((thread_handles[i] =&lt;br /&gt;		     CreateThread(0, 0,&lt;br /&gt;				  (LPTHREAD_START_ROUTINE) client_thread,&lt;br /&gt;				  client_thread_arg, 0,&lt;br /&gt;				  (LPDWORD)&amp;thread_ids[i])) == 0) &lt;br /&gt;			fatal_error2("CreateThread for clients error");&lt;br /&gt;&lt;br /&gt;		printf("created client thread %d\n", i); fflush(stdout);&lt;br /&gt;	}&lt;br /&gt;	free(args);&lt;br /&gt;	args = 0;&lt;br /&gt;&lt;br /&gt;	printf("%d threads created\n", NUM_THREADS); fflush(stdout);&lt;br /&gt;	&lt;br /&gt;	for (i = 0; i &lt; NUM_THREADS; i++) &lt;br /&gt;		WaitForSingleObject(thread_handles[i], INFINITE);&lt;br /&gt;	&lt;br /&gt;	printf("all threads terminated\n"); fflush(stdout);&lt;br /&gt;&lt;br /&gt;	threads_all_done = 1;&lt;br /&gt;	&lt;br /&gt;	ExitThread(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;	int server_sock, client_sock;    &lt;br /&gt;	struct sockaddr_in server_addr, client_addr; &lt;br /&gt;	int client_addr_len;&lt;br /&gt;	unsigned short server_port;   &lt;br /&gt;	char buffer[BUFFER_SIZE];    &lt;br /&gt;	int bytes_received, total_bytes_received; &lt;br /&gt;	int bytes_sent, total_bytes_sent;&lt;br /&gt;	int on = 1;&lt;br /&gt;	unsigned long num_to_read;&lt;br /&gt;	struct timeval timeout;&lt;br /&gt;	struct thread_args *starter_thread_arg;&lt;br /&gt;	WSADATA wsa_data;     &lt;br /&gt;	HANDLE starter_thread_handle;&lt;br /&gt;	DWORD starter_thread_id;&lt;br /&gt;	int client_sockets[NUM_THREADS];&lt;br /&gt;	fd_set socket_fds;&lt;br /&gt;	int size;&lt;br /&gt;	int i;&lt;br /&gt;&lt;br /&gt;	total_bytes_received = total_bytes_sent = 0;&lt;br /&gt;	&lt;br /&gt;	if (WSAStartup(MAKEWORD(2, 0), &amp;wsa_data) != 0) {&lt;br /&gt;		fprintf(stderr, "WSAStartup() error");&lt;br /&gt;		exit(1);&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	total_bytes_received = 0;&lt;br /&gt;	total_bytes_sent = 0;&lt;br /&gt;	&lt;br /&gt;	if ((server_sock = socket(PF_INET, SOCK_STREAM,&lt;br /&gt;				  IPPROTO_TCP)) &lt; 0)&lt;br /&gt;		fatal_error("socket() error");&lt;br /&gt;	&lt;br /&gt;	memset(&amp;client_addr, 0, sizeof(client_addr));     &lt;br /&gt;	memset(&amp;server_addr, 0, sizeof(server_addr));     &lt;br /&gt;	server_addr.sin_family  = AF_INET;       &lt;br /&gt;	server_addr.sin_addr.s_addr = htonl(INADDR_ANY); &lt;br /&gt;	server_addr.sin_port = htons(SERVER_PORT);&lt;br /&gt;	&lt;br /&gt;	if (bind(server_sock, (struct sockaddr *) &amp;server_addr,&lt;br /&gt;		 sizeof(server_addr)) &lt; 0)&lt;br /&gt;		fatal_error ("bind() error ");&lt;br /&gt;	if (listen(server_sock, 5) &lt; 0)&lt;br /&gt;		fatal_error("listen() error");&lt;br /&gt;	&lt;br /&gt;	if ((starter_thread_arg =&lt;br /&gt;	     (struct thread_args *)&lt;br /&gt;	     malloc(sizeof(struct thread_args))) == 0)&lt;br /&gt;		fatal_error("malloc starter_thread_arg error");&lt;br /&gt;&lt;br /&gt;	starter_thread_arg-&gt;server_sock = server_sock;&lt;br /&gt;	server_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);&lt;br /&gt;	memcpy(&amp;starter_thread_arg-&gt;server_addr , &amp;server_addr,&lt;br /&gt;	       sizeof(server_addr));&lt;br /&gt;	starter_thread_arg-&gt;id = -1;&lt;br /&gt;	&lt;br /&gt;	if ((starter_thread_handle =&lt;br /&gt;	     CreateThread(0,0,&lt;br /&gt;			  (LPTHREAD_START_ROUTINE)starter_thread,&lt;br /&gt;			  starter_thread_arg, 0,&lt;br /&gt;			  (LPDWORD)&amp;starter_thread_id)) == 0)&lt;br /&gt;		fatal_error("CreateThread for starter thread error");&lt;br /&gt;	&lt;br /&gt;	for (i = 0; i &lt; NUM_THREADS; i++) {&lt;br /&gt;		client_addr_len = sizeof(client_addr);&lt;br /&gt;		if ((client_sock = accept(server_sock,&lt;br /&gt;					  (struct sockaddr *) &amp;client_addr,&lt;br /&gt;					  &amp;client_addr_len)) &lt; 0)&lt;br /&gt;			fatal_error("accept() error");&lt;br /&gt;#if 0&lt;br /&gt;		printf("connection accepted from %s\n",&lt;br /&gt;		       inet_ntoa(client_addr.sin_addr));&lt;br /&gt;#endif&lt;br /&gt;		client_sockets[i] = client_sock;&lt;br /&gt;	}&lt;br /&gt;	printf("%d clients accepted\n", NUM_THREADS);&lt;br /&gt;&lt;br /&gt;	/* send startup message to all clients */&lt;br /&gt;	for (i = 0; i &lt; NUM_THREADS; i++) {&lt;br /&gt;		int startup_msg_len ;&lt;br /&gt;&lt;br /&gt;		client_sock = client_sockets[i];&lt;br /&gt;		memset(buffer, 0, sizeof(buffer));&lt;br /&gt;		strcpy(buffer, "startup");&lt;br /&gt;		startup_msg_len = strlen(buffer);&lt;br /&gt;		if ((bytes_sent =&lt;br /&gt;		     send(client_sock, buffer,&lt;br /&gt;			  startup_msg_len, 0)) != startup_msg_len)&lt;br /&gt;			fatal_error("sending start signal failed");&lt;br /&gt;&lt;br /&gt;		size = SERVER_SEND_SOCK_BUFFER_SIZE;&lt;br /&gt;		if (setsockopt(client_sock, SOL_SOCKET, SO_SNDBUF, &amp;size, sizeof(size)) &lt; 0)&lt;br /&gt;			fatal_error("SO_SNDBUF error  ");&lt;br /&gt;		size = SERVER_RECV_SOCK_BUFFER_SIZE;&lt;br /&gt;		if (setsockopt(client_sock, SOL_SOCKET, SO_RCVBUF, &amp;size, sizeof(size)) &lt; 0)&lt;br /&gt;			fatal_error("SO_RCVBUF error ");&lt;br /&gt;	&lt;br /&gt;		if (ioctlsocket(client_sock, FIONBIO, &amp;on) &lt; 0)&lt;br /&gt;			fatal_error("FIONBIO error");&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	printf("sent startup messages\n"); fflush(stdout);&lt;br /&gt;	for (;;)  {&lt;br /&gt;		int half = BUFFER_SIZE / 2;&lt;br /&gt;&lt;br /&gt;		if (threads_all_done) break;&lt;br /&gt;&lt;br /&gt;		Sleep(100);	/* slow down server artificially */&lt;br /&gt;		&lt;br /&gt;		FD_ZERO(&amp;socket_fds);&lt;br /&gt;		for (i = 0; i &lt; NUM_THREADS; i++)&lt;br /&gt;			FD_SET(client_sockets[i], &amp;socket_fds);&lt;br /&gt;		timeout.tv_sec = 0;&lt;br /&gt;		timeout.tv_usec = 10000;&lt;br /&gt;&lt;br /&gt;		if (select(0, &amp;socket_fds, 0, 0, &amp;timeout) == 0)&lt;br /&gt;			continue;&lt;br /&gt;&lt;br /&gt;		for (i = 0; i &lt; NUM_THREADS; i++) {&lt;br /&gt;			int errno;&lt;br /&gt;			&lt;br /&gt;			if (! FD_ISSET(client_sockets[i], &amp;socket_fds))&lt;br /&gt;				continue;&lt;br /&gt;&lt;br /&gt;			client_sock = client_sockets[i];&lt;br /&gt;&lt;br /&gt;			/* send half as much */&lt;br /&gt;			if ((bytes_sent =&lt;br /&gt;			     send(client_sock, buffer,&lt;br /&gt;				 half, 0)) != half) {&lt;br /&gt;				errno = WSAGetLastError();&lt;br /&gt;				if (errno == WSAEWOULDBLOCK ||&lt;br /&gt;				    errno == WSAENOBUFS)&lt;br /&gt;					continue;&lt;br /&gt;				fatal_error("send() error");&lt;br /&gt;			}&lt;br /&gt;			total_bytes_sent += bytes_sent;&lt;br /&gt;			&lt;br /&gt;			num_to_read = 0;&lt;br /&gt;			if (ioctlsocket(client_sock, FIONREAD, &amp;num_to_read) &lt; 0) &lt;br /&gt;				fatal_error("FIONREAD error");&lt;br /&gt;			&lt;br /&gt;			if (num_to_read == 0)&lt;br /&gt;				continue;&lt;br /&gt;			&lt;br /&gt;			/* read half as much */&lt;br /&gt;			num_to_read = num_to_read &gt;= half ? half - 1 : num_to_read;&lt;br /&gt;			if ((bytes_received =&lt;br /&gt;			     recv(client_sock, buffer, num_to_read, 0)) &lt;= 0)&lt;br /&gt;				fatal_error("recv() error ");&lt;br /&gt;			total_bytes_received += bytes_received;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	closesocket(server_sock);&lt;br /&gt;	closesocket(client_sock);&lt;br /&gt;	WSACleanup();&lt;br /&gt;	WaitForSingleObject(starter_thread_handle, INFINITE);&lt;br /&gt;&lt;br /&gt;	printf("all threads finished. total bytes received %d sent %d\n",&lt;br /&gt;	       total_bytes_received, total_bytes_sent);&lt;br /&gt;	&lt;br /&gt;	exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 26 Aug 2006 07:13:25 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2471</guid>
      <author>frontera000 (bob bae)</author>
    </item>
  </channel>
</rss>
